Powershell - 如何在Start-Job的scriptblock中预先评估变量

Iva*_*van 17 powershell jobs background start-job scriptblock

我想在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
Run Code Online (Sandbox Code Playgroud)

我得到$ v1和$ v2的空值.如何让它们在(通过)脚本块中进行评估,从而对后台作业进行评估?

mjo*_*nor 32

一种方法是使用[scriptblock] :: create方法使用局部变量从可扩展的字符串创建脚本块:

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

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

$job = Start-Job -ScriptBlock $sb
Run Code Online (Sandbox Code Playgroud)

另一种方法是在InitializationScript中设置变量:

$Init_Script = {
$v1 = "123"
$v2 = "asdf"
}

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

$job = Start-Job -InitializationScript $Init_Script -ScriptBlock $sb 
Run Code Online (Sandbox Code Playgroud)

第三种选择是使用-Argumentlist参数:

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

$sb = {
    Write-Host "Values are: $($args[0]), $($args[1])"
}

$job = Start-Job  -ScriptBlock $sb -ArgumentList $v1,$v2
Run Code Online (Sandbox Code Playgroud)


Jas*_*irk 17

最简单的解决方案(需要V3或更高版本)如下所示:

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

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

$job = Start-Job -ScriptBlock $sb
Run Code Online (Sandbox Code Playgroud)

你可以认为$ using大致像一个显式的param()块并且传递-ArgumentList,只有PowerShell会自动为你处理.