PowerShell ScriptBlock 变量范围
PowerShell ScriptBlock variable scope
我无法理解 ScriptBlock
秒内的范围。我指望某种类似闭包的系统,但我似乎无法让它工作。
我有一个 ScriptBlock
需要一个 param
和 returns 另一个 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
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> = & $sb1 One
One
PS> & Two
One Two
我无法理解 ScriptBlock
秒内的范围。我指望某种类似闭包的系统,但我似乎无法让它工作。
我有一个 ScriptBlock
需要一个 param
和 returns 另一个 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
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> = & $sb1 One
One
PS> & Two
One Two