Tipps

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?

 


 204,    Tipp
Holger Voges

  E-Mail Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Holger Voges ist Inhaber der Firma Netz-Weise IT-Training und seit 1999 als Trainer und Consultant tätig. Als Allrounder in den Bereichen Windows Server, Active Directory, SQL Server, Hyper-V und Windows PowerShell, hat er in der Vergangenheit zahlreiche Einsätze als Consultant in namenhaften Firmen absolviert und so neben der Theorie auch umfangreiche praktische Erfahrungen gesammelt.

 

Netz-Weise

Das Haupt-Tätigkeitsfeld von Netz-Weise sind Schulungen für Profis. Bei uns bekommen Sie das Programm für den fortgeschrittenen Praktiker, der die Tiefen des Systems ausloten möchte genauso wie Standard-Schulungen.

So erreichen Sie uns:

Netz-Weise
IT-Training und Beratung
Freundallee 13a
30173 Hannover
 
Tel: (0511) 165 925-0
Fax: (0511) 165 925-99
email: info(at)netz-weise.de
 

Newsletter bestellen

Das Wichtigste kompakt ins E-Mailfach!