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-Command の ArgumentList パラメーターに渡されます。 スクリプト ブロック内に 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
の内容に置き換えられます。