Windows PowerShell のリモート コンピューターにパラメーターを送信する

完了

リモート コンピューターがそれらの変数を理解できない限り、 Invoke-Command でスクリプト ブロックまたはスクリプト ファイルに変数を含めることはできません。 そのため、開始側コンピューターからリモート コンピューターにデータを渡す方法を見つけるのは、かなり複雑に思えるかもしれません。 ただし、 Invoke-Command には、このタスクを実行するための特定のメカニズムが実際に用意されています。

確認すると、次のコマンドで行おうとしているのは、各ターゲット コンピューターのセキュリティ イベント ログから最新の 10 個のエントリを一覧表示することです。 ただし、次のように書いたのではコマンドは機能しません。

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Get-EventLog –LogName $Log –Newest $Quantity
}

問題は、変数 $Log$Quantity はローカル コンピューター上でのみ意味があり、それらの値がリモート コンピューターに送信される前にスクリプト ブロックに挿入されないことです。 したがって、リモート コンピューターはそれらの意味がわかりません。

このコマンドの正しい構文は次のとおりです。

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity

この構文を使用すると、ローカル変数が Invoke-CommandArgumentList パラメーターに渡されます。 スクリプト ブロック内に Param() ブロックが作成されます。このブロックには、 値の –ArgumentList リストと同じ数の変数が含まれています。この場合は 2 です。 Param() ブロック内の変数には任意の名前を割り当てることができます。 順序に基づいて ArgumentList パラメーターからデータを受け取ります。 言い換えると、$Logが ArgumentList で最初にリストされているため、その値は Param() ブロックの最初のエントリであるため、$xに渡されます。 その後、 Param() ブロック内の変数をスクリプト ブロック内で使用できます(例を参照)。

この構文は、Windows PowerShell 2.0 以降で動作します。 ただし、Windows PowerShell 3.0 では、簡略化された代替アプローチが導入されました。 ローカル変数 $variable があり、その内容をリモート コンピューターで実行されるコマンドに含めたい場合は、次の構文を実行できます。

Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE

$Using: プレフィックスはローカルとリモートのコンピューターによって適切に処理され、$Using:variable はローカル変数 $variable の内容に置き換えられます。