PowerShell ScriptBlock 变量范围



我在理解 ScriptBlock 秒内的作用域时遇到问题。 我指望某种类似闭包的系统,但我似乎无法让它工作。

我有一个ScriptBlock,它接受一个param并返回另一个ScriptBlock

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

为了获得内部ScriptBlock我可以用$sb2 = & $sb1 -Message1 "Message1"调用$sb1。 这与Message1相呼应,因此我们知道param是绑定的。

现在我可以用& $sb2 -Message2 "Message2"调用$sb2. 我本来期望Message1 Message2,但它只是写Message2

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

这是实际外壳的实际输出:

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

你需要显式创建一个闭包:

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

然后它对我有用:

PS> $2 = & $sb1 One
One
PS> & $2 Two
One Two

相关内容

  • 没有找到相关文章

最新更新