denisovd - Fotolia

Probleme mit automatischen PowerShell-Variablen vermeiden

Wenn ein PowerShell-Skript nicht funktioniert, wie es soll, ist guter Rat oft teuer. Manchmal hilft ein Blick auf die automatischen Variablen.

Manche Variablen sollte man in der Windows PowerShell besser nie anfassen, weil dies sonst zu unerwarteten und sicherlich ungewollten Ergebnissen führt. Jeder PowerShell-Einsteiger wird irgendwann an diesen Punkt kommen und sich fragen, was nur mit seinem Skript los ist. Ursache hierfür sind dann meist automatische Variablen.

Die PowerShell selbst benötigt einige Variablen, um korrekt zu funktionieren. Diese Variablen werden zur Speicherung von Informationen genutzt und können ausgelesen werden – aber nicht überschrieben. Die dort gespeicherten Informationen betreffen verschiedenste Bereiche.

Eine der am häufigsten anzutreffenden automatischen Variablen ist die Pipeline-Variable $_, auch $PSItem genannt. Diese Variable wird zur Anzeige von Objekten genutzt, die durch Pipelines verbunden sind.

Wenn man die PowerShell zum Lesen einer CSV-Datei nutzt oder das Cmdlet Get-AdUser zum Finden eines Active-Directory-Nutzers verwendet, aber dabei nicht die ganze CSV-Datei oder alle Active-Directory-Nutzer angezeigt bekommen will, dann stößt man auch bereits auf die nächste automatische Variable: den Where-Alias, auch Where-Objekt genannt. Bei einer CSV-Datei mit den Spalten FirstName und LastName, die hunderte Namen enthält, könnte man durch den Einsatz von Where-Object alle Personen mit dem Nachnamen Jones herausfiltern, wie in Abbildung 1.

Abbildung 1: Namensfilterung mit Where-Object.

In diesem Beispiel wurde die Pipeline-Variable genutzt, um alle Namen anzuzeigen, die vom Import-CSV-Cmdlet kommen. Anschließend wird der LastName-Wert der Pipeline-Variable referenziert und über das Where-Objekt nur die Namen ausgefiltert, deren Nachname Jones lauten. Die Variable $_ kann hier nicht verwendet werden, weil sie bereits von der PowerShell selbst genutzt wird.

Im PowerShell-Skript der Abbildung 2 würde man erwarten, dass die Variable $_ dem Wert somethingelse entspricht. Das ist aber nicht der Fall. Zudem lässt die PowerShell die falsche Nutzung automatischer Variablen zu, ohne dass ein Fehler ausgegeben wird. Dieses Verhalten bringt PowerShell-Nutzer regelmäßig zum Verzweifeln.

Abbildung 2: Falsche Verwendung einer automatischen Variable.

Zwei weitere automatische Variablen sind $true und $false. Die PowerShell reserviert diesen Variablen die Booleschen Werte True und False. Diese Werte werden über verschiedenste PowerShell-Skripte einheitlich verwendet, um bestimmte Zustände zu bewerten. Man könne mit der $false-Variable zum Beispiel herausfinden, ob ein Wert einem anderen gleicht, wie in Abbildung 3, wo das Verhältnis zwischen Integer 1 und Integer 2 bestimmt wird.

Abbildung 3: Einsatz der $true- und $false-Variablen.

In diesem Fall ist 1 nicht gleich 2, was durch den Vergleich des Ergebnisses von 1 –eq 2 mit der automatischen $false-Variable bestätigt wird. Natürlich ergibt dieser Vergleich die andere automatische Variable $true.

Wenn man der automatischen Variable $false eine andere Variable zuweisen möchte, wie in Abbildung 4, dann erhält man eine Fehlermeldung, wonach die Variable nicht verändert werden kann. Das bedeutet nicht mehr, als dass die Variable bereits an einer anderen Stelle einen Wert erhalten hat, der nicht geändert werden kann.

Abbildung 4: Fehlermeldung beim falschen Umgang mit automatischen Variablen.

Die hier aufgeführten Beispiele sind natürlich recht einfach, und kaum jemand würde mit diesen Variablen einen Fehler machen. Wenn man aber mit weitaus größeren Skripten arbeitet, dann kann es wesentlich schwieriger werden, Probleme mit automatischen Variablen aufzuspüren. Dabei sollte man immer daran denken, dass man nicht zwangsläufig eine Fehlermeldung erhalten muss, wenn tatsächlich ein Problem im Skript besteht.

Wenn man also ein Problem mit einem Skript hat, in dem die Cmdlets eigentlich alle korrekt aussehen, dann sollte man sich die automatischen Variablen einmal genauer ansehen. Gut möglich, dass diese im Konflikt mit den von der PowerShell selbst genutzten Variablen stehen.

Folgen Sie SearchDataCenter.de auch auf Twitter, Google+ und Facebook!

Artikel wurde zuletzt im November 2015 aktualisiert

Erfahren Sie mehr über Serverbetriebssysteme

- GOOGLE-ANZEIGEN

ComputerWeekly.de

Close