我在理解ScriptBlock
内的作用域时遇到了一些困难。 我希望有一种类似闭包的系统,但我好像无法使其正常工作。
我有一个接受param
并返回另一个ScriptBlock
的ScriptBlock
:
$sb1 = {
Param($Message1);
Write-Host $Message1;
{
Param($Message2);
Write-Host ($Message1 + " " + $Message2);
}
}
为了获取内部的 ScriptBlock
,我可以使用 $sb1
并调用 $sb2 = & $sb1 -Message1 "Message1"
。这会输出 Message1
,因此我们知道参数已经绑定。
现在我可以使用 & $sb2 -Message2 "Message2"
来调用 $sb2
。我本来期望会输出 Message1 Message2
,但实际上它只输出了 Message2
。
有没有办法访问 $Message1
变量?我不能使用局部或脚本变量,因为内部的脚本块会有不同的 $Message1
实例。
这是实际 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