gpt4 book ai didi

powershell - 如何将 .GetNewClosure() 与 EngineEvent 的 -Action 值一起使用

转载 作者:行者123 更新时间:2023-12-02 20:26:07 24 4
gpt4 key购买 nike

& { 
$action = & { $y = 100
return { write-host "Value: $y" }.getnewclosure()
}

[void] (register-engineevent -sourcei "foo" -action $action)
[void] (new-event -sourcei "foo")
}

上面的代码打印 Value:,而我希望它打印 Value: 100。这里缺少什么吗?

最佳答案

引擎正在调用GetNewClosure()对它来说,这样做总比不做更好。

当我运行上面的代码时,我只得到 Value: 的输出,但后来我全局声明 $y = 25并跑了[void](new-event -sourcei 'foo')再次,输出是 Value: 25 。然后我又改变了它的值,$y = 38 ,并再次运行该事件:Value: 38 .

如果你想要的是烘焙 $y 的值在创建操作时,一种方法是以 $y 的值创建脚本 block 。成为文字或文字的一部分:

$action = &{ $y = 100
return (invoke-expression "{write-host 'Value: $y'}")
}

这首先解析字符串以插入值,因此 Invoke-Expression最终做了相当于这样的事情:

{write-host 'Value: 100'}

除了将脚本 block 的全部内容组成字符串并将其传递给 Invoke-Expression 之外,我不确定是否还有其他方法可以烘焙该值。 .

<小时/>

针对您的评论,对关闭的进一步解释:

> $action100 = &{$y = 100; return {write-host "Value: $y"}.GetNewClosure()}
> &$action100
Value: 100

这就是您期望的结果,这就是您得到的结果,因为脚本 block 仍然在 $y 的值周围“闭合”在 GetNewClosure() 的范围内被叫了。

> $y = 25
> &$action100
Value: 100

仍然在 $y 附近关闭即100 .

> $action25 = $action100.GetNewClosure()
> &$action25
Value: 25

这会生成一个新的脚本 block ,其中包含当前作用域中的变量。它使它重新评估什么$y位于该脚本 block 中,在这种情况下, $y现在 25 岁。

> $y = 38
> &$action100
Value: 100

> &$action25
Value: 25

> &($action100.GetNewClosure())
Value: 38

此时,因为$y现在,当您调用New-Event时,已在全局范围内声明它将使用 GetNewClosure()并重新评估$y38 ,并打印Value: 38 。您已经得到 Value:因为在引擎事件调用 GetNewClosure() 的上下文中变量$y没有定义,所以"Value: $y"变成"Value: " .

关于powershell - 如何将 .GetNewClosure() 与 EngineEvent 的 -Action 值一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6905305/

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