【PowerShell】-ComputerName に複数のリモートコンピューターを指定するとどうなる?


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


結果は、キーとなる 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 等を使用して前の処理が終わるまで次の処理に移動しないように制御する必要があることに注意してください。

Comments (0)

Skip to main content