Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.
2 Minuten Lesezeit (434 Worte)

Gültigkeitsbereiche von Variablen und der Modul-Scope in Powershell

Vor kurzem bin ich auf einen interessanten Artikel von Mike Robbins gestoßen, den ich hier noch einmal kurz zusammengefasst wiedergeben möcht.

Variablen haben in Powershell normalerweise nur eine begrenzten Lebensdauer, die vom Scriptblock definiert ist, in dem Sie deklariert wurde. Sobald der Scriptblock beendet wird, in dem eine Variable deklariert wurde, wird auch die Variable wieder freigegeben. Hierzu ein kleine Beispiel:

$TestVariable = 'Hallo vom Script'
function Test-Scope
{
  $TestVariable = 'Hallo aus der Funktion'
  $TestVariable
}
Test-Scope
$Testvariable

Wie sieht die Ausgabe des Skripts aus und was ist der Inhalt der Testvariablen zu den unterschiedlichen Zeitpunkten?

Das Skript gibt diese Ausgabe zurück:

Hallo aus der Funktion
Hallo vom Script

Das liegt daran, dass die Variable $Testvariable im Scriptblock durch die "neue" Variable gleichen Namens "überdeckt" wird. Ruft man die Funktion auf, gibt die Funktion den Inhalt der Variablen aus, die im Scriptblock definiert wurde. Nach Ablauf des Scriptblocks wird die "neue" Variable entfernt und die alte Variable wird wieder sichtbar. Das geschicht, weil die Variablen auf dem "Stack" abgelegt werden, einem Stapel, der immer das oberste Objekt zurückliefert. Wird in der Funktion eine neue Variable gleichen Namens angelegt, liefert der Stack beim Abrufen die oberste Variable zurück. Das bedeutet im Umkehrschluß, dass die Variable $Testvariable, wird Sie im Scriptblock nicht neu definiert, einfach die "alte" Testvariable zurückliefert:

$TestVariable = 'Hallo vom Script'
function Test-Scope
{
  $TestVariable
}
Test-Scope
$Testvariable

Die Rückgabe sieht dann so aus:

Hallo vom Script
Hallo vom Script

Man kann den Gültigkeitsbereich einer Variablen aber auch eplizit angeben, indem man ihn, mit einem Doppeltpunkt getrennt, vor den Variablennamen schreibt. Dabei kennt Powershell drei Gültigkeitsbereicht: Global, Script und local. Um in der Funktion direkt auf die Skriptvariable zuzugreifen, muß man also nur den Gültigkeitsbereich Script angeben:

$TestVariable = 'Hallo vom Script'
function Test-Scope
{
  $TestVariable = 'Hallo aus der Funktion'
  $Script:TestVariable
  $TestVariable
}
Test-Scope
$Testvariable

Und das ist die Rückgabe:

Hallo vom Script
Hallo aus der Funktion
Hallo vom Script

Spannend ist, was in Modulen passiert, denn Module können aus mehr als einem Skript bestehen, aber es gibt keinen Gültigkeitsbereich Modul. Die Lösung: Hier übernimmt der Gültigkeitsbereich Script die Funktion von Modul. Eine Variable, die in einem Teilskript des Moduls angelegt wird, ist in allen Skripten des Moduls sicht- und benutzbar. Wem das nicht reicht, der kann Scopes auch noch "zählen", wobei das aktuell Scope die Ziffer 0 trägt, der direkt darüberliegende Scope die 1 usw.

Eine ausführliche Behandlung von Scopes findet man in der Powershell-Hilfe unter

Get-Help About_scopes

Weiterführende Links

Mike Robbins: What is this Module Scope in Powershell you speak of?

 

Parametrisierte Programme in Powershell starten am...
Emails mit Skripten oder Multifunktionsgeräten übe...
 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Bereits registriert? Hier einloggen
Gäste
Sonntag, 02. Oktober 2022
Für die Registrierung bitte Benutzername, Passwort und nötige Felder eingeben.

By accepting you will be accessing a service provided by a third-party external to https://www.netz-weise-it.training/

Nach oben