Dieser Gastbeitrag wurde uns freundlicherweise vom Education Support Center (ESCde) zur Verfügung gestellt. Autor ist Moritz Baer.

Das ESCde betreibt im Auftrag von Microsoft Deutschland die TechNet Support Hotline. Mehr Infos unter www.technet.de/hotline.

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, 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 dem selben Namen. Dies ist normal und auch so gewünscht.
Das Problem
Da in der Powershell das Zuweisen von Werten gleichbedeutend mit der Deklaration einer Variable ist, bekommt man jetzt allerdings ein Problem:
$variable = "test"
if($true) {
$variable = "neuer Test"
}
echo $variable
Echo gibt hier unerwarteter Weise test aus.  Die äußere Variable $variable bekommt außerhalb des IF-Blocks den Wert test. Da mit $variable auch eine neue Variable innerhalb des IF-Blocks instanziiert wird, wird der Wert neuer Test in die neue Variable und nicht in die außerhalb deklarierte Variable geschrieben. 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"
if($true) {
$global:variable = "neuer Test"
}
echo $global:variable
Nun gibt echo wie gewünscht neuer Test aus.