gpt4 book ai didi

PowerShell ScriptBlock 变量范围

转载 作者:行者123 更新时间:2023-12-04 17:44:14 26 4
gpt4 key购买 nike

我无法理解 ScriptBlock 中的范围s。我指望某种类似闭包的系统,但我似乎无法让它工作。

我有一个 ScriptBlock这需要 param并返回另一个 ScriptBlock :

$sb1 = {
Param($Message1);
Write-Host $Message1;
{
Param($Message2);
Write-Host ($Message1 + " " + $Message2);
}
}

获取内部 ScriptBlock我可以调用 $sb1$sb2 = & $sb1 -Message1 "Message1" .这与 Message1 相呼应所以我们知道 param是绑定(bind)的。

现在我可以调用 $sb2& $sb2 -Message2 "Message2" .我会期待 Message1 Message2 ,但它只写 Message2反而。

有什么方法可以访问 $Message1多变的?我不能使用本地变量或脚本变量,因为内部脚本 block 的多个实例具有不同的 $Message1 s。

这是实际 shell 的实际输出:
PS C:\> $h1 = { Param($Message1); Write-Host $Message1; { Param($Message2); Write-Host ($Message1 + " " + $Message2); } }
PS C:\> $h2 = & $h1 -Message1 "Message1"
Message1
PS C:\> $h2
Param($Message2); Write-Host ($Message1 + " " + $Message2);
PS C:\> & $h2 -Message2 "Message2"
Message2

最佳答案

您需要明确 create a closure :

$sb1 = {
Param($Message1);
Write-Host $Message1;
{
Param($Message2);
Write-Host ($Message1 + " " + $Message2);
}.GetNewClosure()
}

然后它对我有用:
PS> $2 = & $sb1 One
One
PS> & $2 Two
One Two

关于PowerShell ScriptBlock 变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022194/

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