| | 0

PowerShell: Arbeiten mit Pfaden und Locations

In der PowerShell gibt es verschiedene Location-Cmdlets für die Arbeit mit Verzeichnispfaden. In diesem Artikel möchte ich eine praktische Anwendungsmöglichkeit für diese Befehle vorstellen. Das Beispiel stellt aber nur einen kleinen Ausschnitt der vielfältigen Nutzungsmöglichkeiten dar und soll zu eigenen Experimenten mit den Cmdlets anregen.

Get-Location

Wenn wir eine PowerShell-Konsole öffnen, zeigt uns diese das aktuelle Arbeitsverzeichnis an.

Wollen wir dieses Verzeichnis in einem Script ermitteln, können wir das mit Get-Location tun. Soweit entspricht das pwd unter Linux oder %~dp0 in einem Windows-Batchscript.

1
2
3
4
5
PS D:\> Get-Location
Path
----
D:\

Get-Location kann aber noch mehr: wir können auch das “aktuelle” Arbeitsverzeichnis eines anderen Laufwerks oder eines Providers wie z. B. der Registry abfragen.

1
2
3
4
5
PS D:\> Get-Location -PSDrive C
Path
----
C:\temp
1
2
3
4
5
PS D:\> Get-Location -PSProvider Registry
Path
----
HKLM:\

Set-Location

In der Konsole verwendet man üblicherweise “cd” um in ein anderes Verzeichnis zu wechseln. In der PowerShell ist cd als Alias für Set-Location definiert.

1
2
PS C:\Temp> Set-Location C:\Windows
PS C:\Windows>

Push-Location

Hier wird es spannend: mit diesem Cmdlet können wir einen Pfad auf einen Stack legen und in ein anderes Verzeichnis wechseln.

1
2
PS C:\temp> Push-Location C:\Windows
PS C:\Windows>

Pop-Location

Und mit diesem Cmdlet wechseln wir wieder zurück in das auf dem Stack abgelegte Verzeichnis.

1
2
3
PS C:\temp> Push-Location C:\Windows
PS C:\Windows> Pop-Location
PS C:\temp>

Soweit – so gut. Aber was kann man jetzt in der Praxis mit diesen Befehlen anfangen?

In das aktuelle Scriptverzeichnis wechseln

Bei der Ausführung eines Scripts kann es sinnvoll sein in das Scriptverzeichnis zu wechseln. Wenn wir jetzt eine Datei laden oder speichern wollen, wird hierzu das Verzeichnis verwendet, in dem sich das Script befindet.

Damit vermeiden wir absolute Pfade und machen unser Script flexibel: der Aufruf kann in der Konsole aus einem beliebigen Verzeichnis heraus erfolgen, oder aber direkt aus dem Windows-Explorer. Auch können wir unser Scriptverzeichnis beliebig verschieben ohne anschließend den Pfad anpassen zu müssen, in dem eine Konfigurationsdatei für das Script liegt oder ein Logfile geschrieben werden soll.

Auch die Arbeit mit verschachtelten Scripten wird so vereinfacht. Legen Sie alle Unterscripte in einen Unterordner, z. B. “include”, und binden Sie die Unterscripte wie in dem nachfolgenden Beispiel mit einer relativen Pfadangabe ein. Jetzt können Sie einfach den kompletten Scriptordner in ein Archiv packen und an Ihre Kunden versenden.

Um dies praktisch umzusetzen, benötigen wir zunächst einmal den aktuellen Scriptpfad. Wie man den zuverlässig ermittelt habe ich in diesem Beitrag gefunden:

http://stackoverflow.com/questions/801967/how-can-i-find-the-source-path-of-an-executing-script

Der vollständige Befehl für den Wechsel in den Scriptpfad lautet demnach so:

1
Push-Location $(Split-Path $Script:MyInvocation.MyCommand.Path)

Das entspricht übrigens dem Befehl “PUSHD %~dp0”, der vielleicht dem ein oder anderen noch aus Batchscripts bekannt sein dürfte.

Nach Ausführung unseres eigentlichen Scripts wechseln wir wieder zurück in das Ausgangsverzeichnis. Das ist zwar nicht zwingend erforderlich, aber es gehört zum guten Stil keine Altlasten zu hinterlassen.

Das vollständige Script mit Include eines Unterscripts könnte dann z. B. so aussehen:

1
2
3
4
5
6
7
8
9
Push-Location $(Split-Path $Script:MyInvocation.MyCommand.Path)
 
# Das aktuelle Arbeitsverzeichnis ist jetzt das Scriptverzeichnis
 
. .\include\MyFunctions.ps1
 
# Hier kommt das eigentliche Script hin
 
Pop-Location