2017-02-03 3 views
1

Ich habe Probleme, Bereiche innerhalb von Skriptblöcken zu verstehen. Ich zählte eine Art Schließsystem, aber ich kann es nicht funktionieren sehen.PowerShell-Skriptblock-Variablenbereich

Ich habe eine Skript, die eine param und gibt eine andere Skript nimmt:

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

Um die innere Skript bekommen kann ich $ SB1 aufrufen wie: $sb2 = & $sb1 -Message1 "Message1" Diese Echos „Message1“, so dass wir die param gebunden ist .

Jetzt kann ich $ SB2 wie aufrufen: & $sb2 -Message2 "Message2"

ich erwartet hatte "Message1 Message2" hätte, aber es schreibt nur "Message2" statt.

Gibt es eine Möglichkeit, auf die Variable $ Message1 zuzugreifen? Ich kann eine lokale Variable oder eine Skriptvariable nicht verwenden, da mehrere Instanzen des inneren Skriptblocks mit verschiedenen Message1s vorhanden sind.

Dies ist die tatsächliche Leistung von der eigentlichen Schale:

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 
+0

Ich werde aktualisieren die Frage mit dem, was ich eigentlich renne. Es ist sehr ähnlich. – wensveen

+0

Ah, habe die Zuweisung des Rückgabewertes verpasst. Okay, macht jetzt Sinn :) – Joey

Antwort

4

Sie müssen explizit create a closure:

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

Es funktioniert dann für mich:

PS> $2 = & $sb1 One 
One 
PS> & $2 Two 
One Two 
+0

Okay, wow. Das macht total Sinn. Ich wusste nie, dass ScriptBlock tatsächlich eine GetNewClosure-Methode hatte. Die meisten Sprachen sind nicht so explizit über Schließungen :) – wensveen

+0

Die Wahl kann manchmal schön sein. Ich habe Skripte geschrieben, in denen ich Skriptblöcke verwendete, um auf Variablen zuzugreifen, von denen ich wusste, dass sie dort waren und wo eine Schließung lästig gewesen wäre. Aber ja, normalerweise ist es entweder automatisch oder überhaupt nicht unterstützt :-) – Joey

+0

Das wusste ich auch nicht. Schön! –