I'm having trouble understanding scopes within ScriptBlock
s. I was counting on some kind of closure-like system, but I can't seem to get it working.
I have a ScriptBlock
that takes a param
and returns another ScriptBlock
:
$sb1 = {
Param($Message1);
Write-Host $Message1;
{
Param($Message2);
Write-Host ($Message1 + " " + $Message2);
}
}
To get the inner ScriptBlock
I can invoke $sb1
with $sb2 = & $sb1 -Message1 "Message1"
. This echoes Message1
so we know the param
is bound.
Now I can invoke $sb2
with & $sb2 -Message2 "Message2"
. I would have expected Message1 Message2
, but it just writes Message2
instead.
Is there any way to access the $Message1
variable? I can't use a local or script variable, because there will multiple instances of the inner scriptblock with different $Message1
s.
This is the actual output from the actual 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