Powershellでバックグラウンドジョブを使用したい。
ScriptBlockの定義時に変数を評価する方法は?
$v1 = "123"
$v2 = "asdf"
$sb = {
Write-Host "Values are: $v1, $v2"
}
$job = Start-Job -ScriptBlock $sb
$job | Wait-Job | Receive-Job
$job | Remove-Job
$ v1と$ v2の空の値が出力されます。スクリプトブロックなどで(渡されて)バックグラウンドジョブでそれらを評価するにはどうすればよいですか?
1つの方法は、[scriptblock] :: createメソッドを使用して、ローカル変数を使用して拡張可能な文字列からスクリプトブロックを作成することです。
$v1 = "123"
$v2 = "asdf"
$sb = [scriptblock]::Create("Write-Host 'Values are: $v1, $v2'")
$job = Start-Job -ScriptBlock $sb
別の方法は、InitializationScriptで変数を設定することです。
$Init_Script = {
$v1 = "123"
$v2 = "asdf"
}
$sb = {
Write-Host "Values are: $v1, $v2"
}
$job = Start-Job -InitializationScript $Init_Script -ScriptBlock $sb
3番目のオプションは、-Argumentlistパラメーターを使用することです。
$v1 = "123"
$v2 = "asdf"
$sb = {
Write-Host "Values are: $($args[0]), $($args[1])"
}
$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2
最も単純なソリューション(V3以降が必要)は次のようになります。
$v1 = "123"
$v2 = "asdf"
$sb = {
Write-Host "Values are: $using:v1, $using:v2"
}
$job = Start-Job -ScriptBlock $sb
$ usingは、明示的なparam()ブロックとほぼ同じように機能し、-ArgumentListを渡すと考えることができます。PowerShellのみが自動的に処理します。
私は検証するコンピュータではありませんが、これはうまくいくはずです:
$sb = {
param($p1,$p2)
Write-Host "Values are: $p1, $p2"
}
$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2
仕事に就いたら、これを再確認します。
スクリプトブロックでパラメーターとして値を宣言し、-ArgumentList
を使用してそれらを渡します。
$v1 = "123"
$v2 = "asdf"
$sb = {
param
(
$v1,
$v2
)
Write-Host "Values are: $v1, $v2"
}
$job = Start-Job -ScriptBlock $sb -ArgumentList $v1, $v2
$job | Wait-Job | Receive-Job
$job | Remove-Job