web-dev-qa-db-ja.com

Powershell変数を開始ジョブに渡す

powerShell内で、変数を開始ジョブに呼び出す最良の方法を学びたいので、スクリプトを配置したクライアントに基づいて特定されるため、サーバーごとにスクリプトを編集する必要はありません。

$Servername = 'Server1'
    $pingblock = {
      pathping $servername | Out-File C:\client\PS\ServerPing.TXT
    }
    start-job $pingblock

上記のコードを実行すると、$ servernameの指定を忘れたかのように、ヘルプを含むファイルを取得します。

21
jjamesjohnson

使用 -ArgumentListパラメータStart-Job例:

Start-Job -Scriptblock {param($p) "`$p is $p"} -Arg 'Server1'

あなたの場合:

$pingblock = {param($servername) pathping $servername | Out-File C:\...\ServerPing.txt}
Start-Job $pingblock -Arg Server1
30
Keith Hill

PSv3 +の代替案で キースヒルの役立つ回答 を補完するには:

$using:スコープ修飾子 は、引数を渡す代わりに、Start-Jobに渡されたスクリプトブロック内の呼び出し元のスコープ内の変数の値を参照するために使用できます(デフォルトでは、バックグラウンドジョブとして実行されたスクリプトブロックは、しない呼び出し元の変数またはその他の定義を参照しません)。

$Servername = 'Server1'
Start-Job { "Target: " + $using:ServerName } | Receive-Job -Wait -AutoRemoveJob

上記の結果は:

Target: Server1

リモートコンピューターで実行するスクリプトブロックをInvoke-Commandに渡す場合も同じ手法を使用できることに注意してください- この質問 を参照してください。

6
mklement0