Zum Hauptinhalt springen

Gültigkeitsbereiche (Scopes)

Eine Variable in Powershell hat immer eine vordefinierte Lebensdauer. Spätestens mit Schließen des Powershell-Prozesses werden alle Variablen entsorgt. Viele Variablen haben aber eine deutlich kürzere Existenz.

Die Gültigkeit einer Variablen wird normalerweise durch den Skriptblock definiert, in dem sie erzeugt wurde. Folgendes Beispiel verdeutlicht das:

$SkriptVariable = 'Global'
$SkriptVariable

function Test-Scope
{
   $SkriptVariable
   $SkriptVariable = 'Skript'
   $SkriptVariable
}

Test-Scope
$SkriptVariable
> Global # Ausgabe aus (1)
> Global # Ausgabe aus (2)
> Skript # Ausgabe aus (3)
> Global # Ausgabe aus (4)

In Zeile 1 wird eine Variable $Skriptvariable erzeugt und ausgegeben. Als nächstes wird die Funktion Test-Scope aufgerufen, die zuerst (in Zeile 6) $Skriptvariable ausgibt. Anschließend wird die Variable durch den String "Text" überschrieben und in Zeile 8 wieder ausgegeben. Die Ausgabe von $Skriptvariable ergibt nun "Skript" (Zeile 15). Nach Beendigung der Funktion wird der Inhalt von $Skriptvariable in Zeile 16 erneut ausgegeben. Der Inhalt ist nun wieder "Global" und nicht mehr "Skript". 

Ursache für dieses Verhalten ist, dass eine Variable immer nur in dem Skriptblock sichtbar ist, in dem sie deklariert wurde, sowie in Skriptblöcken, die aus diesem aufgerufen werden. $Skriptvariable ist im gesamten Skript gültig und kann in allen Sub-Skriptblöcken aufgelöst werden. Wenn in einem Sub-Skriptblock eine Variable gleichen Namens angelegt wird, wird die globale Variable nicht überschrieben, sondern im Skriptblock wird eine neue Variable angelegt, die die Skript-Variable quasi überlagert. Innerhalb des Skriptblocks hat die Skriptblock-lokale Variable nun Vorrang. Nach Beendigung des Skriptblocks wird die Skriptblock-Variable wieder freigegeben und aus dem Speicher entfernt. Nun wird wieder auf die Skriptvariable zurückgegriffen. Man spricht von Gültigkeitsbereichen (Scopes).

Um auf die globale Variable des Skripts zurückzugreifen, kann man den Gültigkeitsbereich mit einem Scope-Modifier explizit angeben:

$Skriptvariable = 'Skript'
function Test-Scope
{
   $SkriptVariable = 'Funktion'
   $Script:SkriptVariable
}
Test-Scope

In diesem Beispiel gibt die Funktion Skript zurück. 

Der Scope-Modifier wird, mit einem Doppelpunkt getrennt, vor den Variablennamen geschrieben. Powershell kennt vier Bezeichner für Gültigkeitsbereiche: Global, Script, Local und Private. Ab Powershell 3.0 kann man mit Hilfe des Bezeichners using: außerdem Variablen an Skriptblöcke übergeben, die per Invoke-Command auf einem anderen Rechner ausgeführt werden. Using: wird im Kapitel Powershell Remoting ausführlich behandelt.

 

Scope

 

 

Global:

Der Gültigkeitsbereich des Powershell-Prozesses. Alle automatischen- und Einstellungs-Variablen liegen hier, sowie alle Variablen, die in diesem Prozess erstellt wurden.

 

Script:

Der Gültigkeitsbereich eines Skriptes. Er wird erstellt, wenn ein Skript gestartet wird. Innerhalb eines Moduls wird der Script:-Scope zum Modul-Scope, ist also in allen Scripten des Moduls gültig.

 

Local:

Der lokale Gültigkeitsbereich bezieht sich immer auf den Scriptblock, indem local: aufgerufen wird. Wenn eine Variable in der Konsole als $local:test definiert wird, ist sie identisch mit $global:test.

Private:

Der private Gültigkeitsbereich ist außerhalb seines Scriptblocks nicht sichtbar, wird also auch nicht vererbt.

 

Using:

Erlaubt es, auf Variablen aus dem äußeren Skriptblock innerhalb eines Sub-Scriptblocks zuzugreifen, der Remote (in einem anderen Powershell-Prozess) ausgeführt wird.

 

Man kann auf die Gültigkeitsbereiche auch durch die Nummer der Schachtelungstiefe zugreifen, wobei der aktuelle (lokale) Gültigkeitsbereich die Nummer 0 hat, 1 ist der darüberliegende Gültigkeitsbereich, usw.

Um sich nur die Variablen eines Gültigkeitsbereichs anzeigen zu lassen, kann man Get-Variable mit dem Parameter -Scope aufrufen:

Get-Variable -Scope local