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の値に置き換えられます。