2016-06-30 5 views
1

私は単純にpowershellスクリプトを書いています。これは基本的にいくつかのPCの名前を受け入れて配列に保存します。 PCのそれぞれでPsInfoとPsGetsidを取る)。私が必要とするのは、PC1を取ってPsInfoを実行し、続いてPsGetsidを実行し、次にPC2を取ってPsInfoを実行し、その後にPsGetsidなどを実行します。私のコードでは、PC1を取り、PsInfoを実行し、次に、各PCで2番目のコマンドを実行します。複数の文をforループに入れ、powershellでユーザ定義の配列を使用する

しかし、配列を静的配列(ユーザー入力なし)に変更すると、完全に機能します。ここ

$list = read-host "Enter the pc names seperated by comma :" 
foreach ($element in $list){ 
Write-Host "PsInfo" 
psinfo \\$element 
Write-Host "PsGetSid" 
psgetsid \\$element 

} 

そして、私はそれはデータが読み込まれる方法とは何かを持っている場合は、任意のヘルプは理解されるであろうことを確認していない私のサンプル出力

PS C:\Users\ebinissac\Desktop> ./test1.ps1 
Enter the pc names seperated by comma :: ebinissac,ebinissac1,sithu 
PsInfo 

PsInfo v1.77 - Local and remote system information viewer 
Copyright (C) 2001-2009 Mark Russinovich 
Sysinternals - www.sysinternals.com 

System information for \\ebinissac: 
Uptime:     0 days 3 hours 22 minutes 1 second 
Kernel version:   Windows 7 Enterprise, Multiprocessor Free 
Product type:    Professional 
Product version:   6.1 
Service pack:    0 
Kernel build number:  7601 
Registered organization: xxxxx 
Registered owner:   xxxx 
IE version:    9.0000 
System root:    C:\WINDOWS 
Processors:    8 
Processor speed:   3.5 GHz 
Processor type:   Intel(R) Core(TM) i7-4790 CPU @ 
Physical memory:   3170 MB 
Video driver:    Intel(R) HD Graphics 4600 

System information for \\ebinissac1: 
Uptime:     0 days 8 hours 3 minutes 37 seconds 
Kernel version:   Windows 10 Enterprise, Multiprocessor Free 
Product type:    Professional 
Product version:   6.3 
Service pack:    0 
Kernel build number:  10586 
Registered organization: xxx 
Registered owner:   xxx 
IE version:    9.0000 
System root:    C:\WINDOWS 
Processors:    8 
Processor speed:   3.5 GHz 
Processor type:   Intel(R) Core(TM) i7-4790 CPU @ 
Physical memory:   304 MB 
Video driver:    Intel(R) HD Graphics 4600 

System information for \\sithu: 
Uptime:     14 days 1 hour 13 minutes 36 seconds 
Kernel version:   Windows 7 Enterprise, Multiprocessor Free 
Product type:    Professional 
Product version:   6.1 
Service pack:    0 
Kernel build number:  7601 
Registered organization: xxx 
Registered owner:   xxxx 
IE version:    9.0000 
System root:    C:\WINDOWS 
Processors:    8 
Processor speed:   3.3 GHz 
Processor type:   Intel(R) Core(TM) i7-3770 CPU @ 
Physical memory:   3988 MB 
Video driver:    Intel(R) HD Graphics 4000 
PsGetSid 

PsGetSid v1.44 - Translates SIDs to names and vice versa 
Copyright (C) 1999-2008 Mark Russinovich 
Sysinternals - www.sysinternals.com 

\\ebinissac: 
SID for \\ebinissac: 
S-1-5-21-xxxxxxxxxxxxxxxxx 

\\ebinissac1: 
SID for \\ebinissac1: 
S-1-5-21-xxxxxxxxxxxxxxxxx 

\\sithu: 
SID for \\sithu: 
S-1-5-21-xxxxxxxxxxxxxxxxxx 

です。ここに私のコードです。 TIY

答えて

1

"ebinissac", "ebinissac1", "sithu"よりも、Read-Hostが"ebinissac,ebinissac1,sithu"を返しています。つまり、$ listには1つの要素しかなく、コマンドごとに3つすべてを一度に実行します。

Sodawillowが示唆しているように、出力を$list.Split(",")で分割して列挙できる配列を得ることができます。これは、現在の書式設定を保持する場合に必要です。

代替:

Param([Parameter(Mandatory = $true)] [String[]]$PCName) 

それは次のようになります。

PCName[1]: ebinissac 
PCName[2]: ebinissac1 
PCName[3]: sithu 
PCName[4]: 

、あなたは空白の名前を入力するまでループし続けます。 $ PSNameには手を加えずに配列が含まれています(もっと特定の変数名を使う方が良い場合は、$ listに保存することができます)。

どのように情報を入力するかによって異なります。

+0

私はクライアントPCにいくつかのソフトウェアをインストールするためにこれを使用していますので、一度名前を入力してから実行するだけで済むので、現在のフォーマットを使用するのがより簡単になります。 Sodawillowの提案はエラーを修正しました。ありがとうございました – tuxebin

3

あなたはこれで,にユーザーの入力を分割しようとすることができます:私はRead-Hostが直接コレクションを返すことができないと思います

$list = (Read-Host "Enter the pc names seperated by comma").Split(",") 

+0

絶対に正しい。 'Read-Host'は' String [] 'ではなく' String'を返します。 – n01d

+0

ありがとうございます、これは動作します:) – tuxebin

関連する問題