首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScriptBlock.GetNewClosure()行为

ScriptBlock.GetNewClosure()行为
EN

Stack Overflow用户
提问于 2010-10-30 20:38:20
回答 2查看 2.3K关注 0票数 10

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

代码语言:javascript
复制
$i = 1
$block1 = 
{
    $i
}

$i = 2
$block2 = 
{
    $i
}

$i = 3
$block3 = 
{
    $i
}


& $block1
& $block2
& $block3

输出为:

代码语言:javascript
复制
3
3
3

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

代码语言:javascript
复制
$i = 1
$block1 = 
{
    $i
}.GetNewClosure()

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

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


& $block1
& $block2
& $block3

这一次的输出是:

代码语言:javascript
复制
1
2
3

这很好,但当我尝试将ScriptBlocks作为作业时:

代码语言:javascript
复制
$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线程,其中x0n表示作业是在动态模块中执行的。模块具有独立的sessionstate,并共享对全局变量的访问。PowerShell闭包只能在相同的会话状态/作用域链中工作

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

代码语言:javascript
复制
$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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-30 22:01:41

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

代码语言:javascript
复制
$i = 42
$block1 =
{
    param($i)
    $i * 2
}

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

输出:

代码语言:javascript
复制
84

另注:据报道,GetNewClosure也不能与Register-ObjectEvent一起工作:https://connect.microsoft.com/PowerShell/feedback/details/541754/getnewclosure-doesnt-work-on-register-objectevent

票数 10
EN

Stack Overflow用户

发布于 2015-12-06 04:56:37

代码语言:javascript
复制
$i = 1
$block1 =  {"block 1 is $using:i" }.GetNewClosure()

$i = 2
$block2 = { "block 2 is $using:i" }.GetNewClosure()

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

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

http://www.powertheshell.com/closure/

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4058721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档