Windows PowerShell のリモート コンピューターにパラメーターを送信する
Invoke-Command は、リモート コンピューターで解決できない限り、スクリプト ブロックまたはスクリプト ファイルに変数を含めることはできません。 さいわい、 Invoke-Command には、ローカル コンピューターからリモート コンピューターにデータを渡す組み込みの方法が用意されています。
次のコマンドは、対象となる各コンピューターに最新の 10 個のセキュリティ イベント ログ エントリを表示することを目的としていますが、書き込まれたとおりには機能しません。
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Get-WinEvent –LogName $Log –MaxEvents $Quantity
}
変数 $Log と $Quantity はローカル コンピューターにのみ存在します。 これらの値は、リモート コンピューターに送信される前にスクリプト ブロックに挿入されないため、リモート コンピューターでは解決できません。
ArgumentList を使用して変数を渡す
このコマンドの正しい構文は次のとおりです。
$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
Param($x,$y) Get-WinEvent –LogName $x –MaxEvents $y
} –ArgumentList $Log,$Quantity
Note
これらの例では、 非推奨の Get-EventLog コマンドレットの最新の置き換えである Get-WinEvent を使用します。
Get-WinEvent では、-MaxEventsではなく-Newestを使用して結果を制限します。
ローカル変数は、-ArgumentList の パラメーターに渡されます。 スクリプト ブロック内で、 Param() ブロックは、 -ArgumentListの値と同じ数の変数 (この場合は 2) を宣言します。
Param() ブロック内の変数には任意の名前を割り当てることができます。
-ArgumentListから順番に値を受け取るため、$Logが最初に一覧表示されるため、その値は $x最初のエントリである に移動します。 その後、 Param() ブロック変数はスクリプト ブロック全体で使用できます。
"$Using:" プレフィックスを使用する
この構文は、Windows PowerShell 2.0 以降で機能します。 Windows PowerShell 3.0 では、より簡単な代替手段が導入されました。 ローカル変数 $variable があり、リモート コンピューターで実行されるコマンドでその値を使用する場合は、 $Using: プレフィックスを使用します。
Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE
ローカル コンピューターとリモート コンピューターの両方で、 $Using: プレフィックスが正しく処理され、 $Using:variable がローカル $variableの値に置き換えられます。