web-dev-qa-db-ja.com

PowerShell-Start-Jobのスクリプトブロック内の変数を事前評価する方法

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の空の値が出力されます。スクリプトブロックなどで(渡されて)バックグラウンドジョブでそれらを評価するにはどうすればよいですか?

18
Ivan

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
30
mjolinor

最も単純なソリューション(V3以降が必要)は次のようになります。

$v1 = "123"
$v2 = "asdf"

$sb = {
     Write-Host "Values are: $using:v1, $using:v2"
}

$job = Start-Job -ScriptBlock $sb

$ usingは、明示的なparam()ブロックとほぼ同じように機能し、-ArgumentListを渡すと考えることができます。PowerShellのみが自動的に処理します。

17
Jason Shirk

私は検証するコンピュータではありませんが、これはうまくいくはずです:

$sb = {
    param($p1,$p2)
    Write-Host "Values are: $p1, $p2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2

仕事に就いたら、これを再確認します。

2
beavel

スクリプトブロックでパラメーターとして値を宣言し、-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
2
David Martin