質問

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の空の値が印刷されます。 Scriptblockなどで(渡された)(渡されて)バックグラウンドジョブに評価するにはどうすればよいですか?

役に立ちましたか?

解決

1つの方法は、[ScriptBlock] ::メソッドを作成して、ローカル変数を使用して広範囲の文字列からスクリプトブロックを作成することです。

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

$sb = [scriptblock]::Create("Write-Host 'Values are: $v1, $v2'")

$job = Start-Job -ScriptBlock $sb

別の方法は、初期化に変数を設定することです。

$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

$を使用して、明示的なparam()ブロックとパスArgumentListのように動作すると考えることができますが、PowerShellのみがそれを自動的に処理します。

スクリプトブロックのパラメーターとして値を宣言し、使用して渡します -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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top