Windows PowerShell のコマンドレットには、-ComputerName というパラメタを持つものが多く存在します。
これは、WMIを使用してリモートコンピューターのクラスに接続して、情報を取得したり処理を行うためのものです。
-ComputerName には以下のようにして複数のコンピューターを指定することができます。
Get-Service -ComputerName tfdc01,tfsv01 |Select-Object name,machinename Name MachineName ---- ----------- adfssrv tfsv01 AdtAgent tfdc01 AdtAgent tfsv01 ADWS tfdc01 AeLookupSvc tfsv01 AeLookupSvc tfdc01 ・ ・ ・
Get-Service -ComputerName tfdc01,tfsv01 |Select-Object name,machinename
Name MachineName ---- ----------- adfssrv tfsv01 AdtAgent tfdc01 AdtAgent tfsv01 ADWS tfdc01 AeLookupSvc tfsv01 AeLookupSvc tfdc01 ・ ・ ・
結果は、キーとなる Name の昇順で表示されていることがわかります。
もしコンピューターごとにまとめて出力するのであれば、以下のように指定すればOkです。
Get-Service -ComputerName tfdc01,tfsv01 |Sort-Object MachineName |Select-Object MachineName,Name,Status
さて、ここで疑問です。
複数のコンピューター名を指定した場合、処理はパラレルで行われるのでしょうか?それとも ForEach のように順番に処理されるのでしょうか?
ためしに複数のコンピューターに対して以下のコマンドレットを実行してみます。これはリモートコンピューターに接続して3秒後に現在の日時をミリ秒まで取得し表示しています。
$List = "tfsv01","tfsv02","tfsv03","tfdc01","tfdc02","tfops","tfsql2"
Invoke-Command -ComputerName $List {Start-Sleep -Seconds 3 ;$d = Get-Date -Format "yyyy/MM/dd hh:mm:ss.ffffff" ; "$Env:ComputerName $d" }
TFDC01 2012/06/15 12:22:08.706333 TFOPS 2012/06/15 12:22:08.911051 TFSV02 2012/06/15 12:22:08.754154 TFSV03 2012/06/15 12:22:08.789182 TFSQL2 2012/06/15 12:22:08.875165 TFDC02 2012/06/15 12:22:09.124391 TFSV01 2012/06/15 12:22:09.032098
もしシーケンシャルに実行されるのであれば、それぞれの時刻に3秒の差があるはずですが、どうもそうではないようです。
また、シーケンシャルであれば、Listの頭から(もしくはお尻から)実行されるのが普通でしょう。
と考えると、以下のように実行されていることがわかります。
指定したサーバーの順に、シーケンシャルに実行されるわけではない..という点が何とも素敵ですが、逆にこれが面倒を起こすこともありますね。
シーケンシャルに処理を行いたい場合には、ForEach 等を使用して前の処理が終わるまで次の処理に移動しないように制御する必要があることに注意してください。