我想在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,以及对后台作业?

有帮助吗?

解决方案

一种方法是使用[ScriptBlock] ::创建方法使用本地变量从可伸缩字符串创建脚本块:

$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 

第三个选项是使用-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

您可以认为$使用$像explicit 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