Powershell klärt mit Test-Path die Variablen ab
4. Mai 2010Wer selbst Skripts erstellt, der weiß eines genau: Es hilft enorm, wenn man Informationen besitzt, ob eine Variable existiert ehe man auf sie zugreift. Wer sich aber die Powershell genauer ansieht, der wird zugeben müssen: Ein Cmdlet genau für diese Aufgabe existiert nicht. Doch die Powershell braucht ein derartiges Konstrukt auch nicht – ist doch mit dem Cmdlet Test-Path eine weitaus allgemeinere Version eines Cmdlets verfügbar, das diese Aufgaben – und viele zusätzliche – übernehmen kann.
Wer selbst Skripts erstellt, der weiß eines genau: Es hilft enorm, wenn man Informationen besitzt, ob eine Variable existiert, ehe man auf sie im Skript zugreift. Wer sich aber die Powershell genauer ansieht, der wird zugeben müssen: Ein Cmdlet genau für diese Aufgabe existiert nicht.
Doch die Powershell braucht ein deratiges Konstrukt auch nicht – ist doch mit dem Cmdlet Test-Path eine weitaus allgemeinere Version eines Cmdlets verfügbar, das diese Aufgaben – und viele zusätzliche – übernehmen kann.
Das Hantieren mit Dateien und Verzeichnissen war immer schon ein wichtiger Teil, wenn man Skripts im Administrationsbereich zu schreiben hat. Dabei muss das Skript in vielen Fällen abklären, ob eine bestimmte Datei oder ein Ordner existiert. Ein derartiges Test- oder Abfrage-Code gehört meisten zu der gesuchten Lösung.
Deswegen besitzt die Powershell das Cmdlet Test-Path. Mit seiner Hilfe lässt sich schnell und ohne viel Aufwand bestimmen, ob eine Datei oder ein Verzeichnis schon vorliegt. Um zum Beispiel abzufragen, ob die datei namens bootsect.bak im Wurzelverzeichnis des C-Laufwerks liegt, kann man diesen Befehl verwenden:
Test-Path -Path c:\bootsect.bak
Dieser Befehl liefert das Ergebnis „True“, wenn die Datei C:\bootsect.bak existiert. Ist das nicht der Fall, wird ein „False“ zurück geliefert.
Ähnlich ist das Vorgehen, wenn man wissen möchte, ob das Windows-Verzeichnis unter dem Wurzel-Verzeichnis vom lokalen Laufwerk C: existiert:
Test-Path -Path c:\windows
Doch Dateien und Verzeichnisse sind nicht die einzigen Objekte, die in einer Powershell-Umgebung über einen Pfad verfügen. Die Powershell stellt eine Vielzahl von anderen Objekten zur Verfügung, darunter Variable, Registry-Schlüssel, Funktionen, Aliases und Zertifikate.
Da all diese Objekte über einen Pfad verfügen, lassen sie sich auch mit Hilfe von Test-Path überprüfen und so feststellen, ob sie existieren. Zum Beispiel liefert der folgende Befehl eine Auflistung aller aktuell auf einem System verfügbaren Laufwerke:
Get-PSDrive
In der Abbildung 1 sind die zugehörigen Ergebnisse zu sehen.
In diesem Zusammenhang sind die "Laufwerke" (Drives) mit der Bezeichnung “Variable” und “Env” interessant. Das Laufwerk „Variable“ gibt einem einen Pfad, mit dessen Hilfe man auf die Variablen zugreifen kann, die aktuell in der Powershell-Umgebung definiert sind. Angenommen der Administrator möchte testen, ob eine Variable mit dem Namen „ofs“ existiert, muss er den folgenden Befehl nehmen:
Test-Path variable:\ofs
Das Laufwerk “Env” enthält dagegen die Umgebungsvariablen, die von der Windows-Shell-Umgebung ererbt wurden. Angenommen der Administrator möchte wissen, ob die Umgebungsvariable %temp% definiert ist, kann er das folgende Kommando verwenden:
Test-Path env:\temp
Das Cmdlet Get-PSDrive liefert auch das Function-Drive und zwei Registry-Drives. Das Function-Drive erlaubt den Zugriff auf die Funktionen der Powershell auf dieselbe Art und Weise wie man auf Verzeichnisse und Dateien zugreift.
Um zum Beispiel einen Test nach der standardmäßig verfügbaren Powershell-Funktion „more“ auszuführen, kann man den folgenden Befehl verwenden:
Test-Path Function:\more
Die anzeigbaren Registry-Drives sind HKLM und HKCU. Um zum Beispiel herauszufinden, ob der Registry-Schlüssel HKEY_LOCAL_MACHINE\Software existiert, ist der folgende Powershell-Befehl nötig:
Test-Path HKLM:\Software
Das Cmdlet Test-Path zeigt, welche Vorteile das Powershell-Konzept “Alles ist ein Pfad” bietet. Anstelle verschiedene Werkzeuge für das Existieren von Ordnern, Dateien, Registry-Schlüsseln oder anderen Objekten einzusetzen (so wie das VBScript oder andere traditionelle Windows-basierte Skriptsprachen machen) einsetzen zu müssen, bedarf es nur eines einzigen Tools und einer einzelnen Syntax. Damit können sich die Administratoren auf die eigentliche Aufgabenstellung konzentrieren und müssen nicht eine Vielzahl von Werkzeugen im Blickfeld behalten.