- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图弄清楚 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 中的 param
和 Start-Job
的 ArgumentList
参数:
$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/
我试图弄清楚 ScriptBlock.GetNewClosure() 是如何工作的。基于this线程(请参阅 Stej 的答案)我有以下代码: $i = 1 $block1 = { $i }
我试图了解 .GetNewClosure() 如何在 PowerShell 2 中的脚本 cmdlet 的上下文中工作。 本质上,我有一个返回对象的函数,如下所示: function Get-AnOb
我正在尝试构建一个函数,该函数本身可以通过 Set-Item 命令创建函数,在该命令中,我将新函数的脚本 block 传递给 Set-Item 的 -Value 参数。我遇到了一个问题,在脚本 blo
& { $action = & { $y = 100 return { write-host "Value: $y" }.getnewclosure() } [
我是一名优秀的程序员,十分优秀!