gpt4 book ai didi

powershell - ScriptBlock.GetNewClosure() 行为

转载 作者:行者123 更新时间:2023-12-03 07:01:36 26 4
gpt4 key购买 nike

我试图弄清楚 ScriptBlock.GetNewClosure() 是如何工作的。基于this线程(请参阅 Stej 的答案)我有以下代码:

$i = 1
$block1 =
{
$i
}

$i = 2
$block2 =
{
$i
}

$i = 3
$block3 =
{
$i
}


& $block1
& $block2
& $block3

输出为:

3
3
3

这是预期的,因为执行 ScriptBlock 时将使用当前的 $i 值。这可以使用 GetNewClosure() 进行更改:

$i = 1
$block1 =
{
$i
}.GetNewClosure()

$i = 2
$block2 =
{
$i
}.GetNewClosure()

$i = 3
$block3 =
{
$i
}.GetNewClosure()


& $block1
& $block2
& $block3

这次的输出是:

1
2
3

这很好,但是当我尝试将 ScriptBlocks 作为作业加注星标时:

$i = 1
$block1 =
{
$i
}.GetNewClosure()

$i = 2
$block2 =
{
$i
}.GetNewClosure()

$i = 3
$block3 =
{
$i
}.GetNewClosure()


$job1 = Start-Job $block1
$job1 | Wait-Job
$job1 | Receive-Job

$job2 = Start-Job $block2
$job2 | Wait-Job
$job2 | Receive-Job

$job3 = Start-Job $block3
$job3 | Wait-Job
$job3 | Receive-Job

没有输出。在寻找答案时,我发现了 this thread,其中 x0n 表示作业在动态模块中执行。模块具有隔离的 session 状态,并共享对全局变量的访问。 PowerShell 闭包仅在同一 session 状态/作用域链中工作

这是否意味着 $i 无法从作业访问?当我测试它的值时:

$i = 1
$block1 =
{
$i -eq $null
}.GetNewClosure()

$i = 2
$block2 =
{
$i -eq $null
}.GetNewClosure()

$i = 3
$block3 =
{
$i -eq $null
}.GetNewClosure()


$job1 = Start-Job $block1
$job1 | Wait-Job
$job1 | Receive-Job

$job2 = Start-Job $block2
$job2 | Wait-Job
$job2 | Receive-Job

$job3 = Start-Job $block3
$job3 | Wait-Job
$job3 | Receive-Job

$ 等于 null。

最佳答案

是的,这意味着 $i 无法通过这种方式从作业访问。很遗憾。因此,使用另一种方式:例如,要作为作业调用的脚本 block 中的 paramStart-JobArgumentList 参数:

$i = 42
$block1 =
{
param($i)
$i * 2
}

$job1 = Start-Job $block1 -ArgumentList $i
$job1 | Wait-Job | Receive-Job

输出:

84

附注据报道,GetNewClosure 也不适用于 Register-ObjectEvent: https://connect.microsoft.com/PowerShell/feedback/details/541754/getnewclosure-doesnt-work-on-register-objectevent

关于powershell - ScriptBlock.GetNewClosure() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4058721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com