Beim Erstellen eines Skripts ist es oft hilfreich einzelne Programmteile als eine Funktion im Code anzulegen. Hier kann man in unerwartete Probleme mit Variablen geraten.

Das Szenario

Wie in fast jeder Programmiersprache, so gibt es auch in der PowerShell die Unterscheidung zwischen lokalen und globalen Variablen bzw. entsprechenden Unterformen. Eine, innerhalb eines Klammer-Blocks deklarierte, Variable überschreibt für den Klammer-Block eine außerhalb definierte Variable mit demselben Namen. Dies ist normal und auch so gewünscht.

Das Problem

In der PowerShell gibt es sogenannte Scopes, die den Zugriff auf Variablen, Aliase, Funktionen und PowerShell Skripte schützen.

$variable = "test"
function test($foo) {
   $variable = $foo
}

test(“neuer Test”)
echo $variable

Echo gibt hier unerwarteter Weise test aus. Die äußere Variable $variable bekommt außerhalb der Funktion den Wert test. Mit $variable wird auch eine neue Variable innerhalb der Funktion instanziiert. Diese Variable ist allerdings nur in dem Scope der Funktion sichtbar, in der sie erstellt wurde, und in allen Child Scopes. Die äußere Variable bleibt also unangetastet.

Die Lösung

Um ein solches ungewolltest Dilemma zu vermeiden, kann man in der PowerShell den Zugriff konkret auf den globalen-Kontext legen. Anstatt mit $NAME legt man die Variablen mit $global:NAME an:

$global:variable = "test"
function test($foo) {
   $global:variable = $foo
}

test(“neuer Test”)
echo $variable

Nun gibt echo wie gewünscht neuer Test aus.