我在理解ScriptBlock
中的范围时遇到了麻烦。我当时指望某种类似于闭包的系统,但似乎无法正常运行。
我有一个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
变量吗?我不能使用局部变量或脚本变量,因为内部脚本块的多个实例具有不同的$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
最佳答案
您需要显式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