PowerShell ScriptBlock变量范围

时间:2017-02-03 10:34:04

标签: powershell scope closures scriptblock

我无法理解ScriptBlock内的范围。我指望某种类似封闭的系统,但我似乎无法让它发挥作用。

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

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

要获取内部ScriptBlock,我可以使用$sb1调用$sb2 = & $sb1 -Message1 "Message1"。这与Message1相呼应,因此我们知道param已绑定。

现在我可以使用$sb2调用& $sb2 -Message2 "Message2"。我原本期望Message1 Message2,但它只会写Message2

有没有办法访问$Message1变量?我无法使用本地或脚本变量,因为内部scriptblock的多个实例具有不同的$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

1 个答案:

答案 0 :(得分:7)

您需要明确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