Tags: Datei-Management, PowerShell
Bei der Arbeit mit Dateinamen ist es gelegentlich notwendig, aus diesen die einzelnen Bestandteile wie Laufwerk, Pfad oder Namen zu extrahieren. Die Cmdlets Get-ChildItem und Split-Path helfen dabei.
Zweiteres ist auch in der Lage, Pfade in der Registry oder im AD parsen, wenn diese als Laufwerk gemountet werden.
Grundsätzlich kann man die benötigten Dateinamen bereits mit Get-ChildItem ermitteln und anschließend aus dem Ergebnis die gewünschten Glieder auslesen. Im Fall des Dateinamens geht dies recht einfach, indem man den Parameter name verwendet:
Get-ChildItem *.doc -name
Das Ergebnis ist ein String bzw. ein Array von Strings, während Get-ChildItem sonst immer FileInfo-Objekte zurückgibt. Diese enthalten jedoch eine Reihe von Eigenschaften, darunter den gesamten Namen inklusive Pfad (FullName), den Pfad alleine (DirectoryName) und den Dateinamen mit (Name) und ohne Erweiterung (BaseName):
Get-ChildItem *.doc |select Name, DirectoryName, BaseName, FullName
Split-Path bietet mehr Optionen
Steht man etwa vor der Aufgabe, eine Liste von Dateinamen aus einer Datei einlesen und parsen zu müssen, dann hilft Get-ChildItem nicht weiter. Diese Lücke füllt Split-Path. Es kann sowohl die Namen und Pfade von Objekten aus dem Dateisystem, AD oder der Registry ermitteln, als auch reine Zeichenketten parsen, wenn sie der Syntax von Dateinamen entsprechen.
Für das Zerlegen der Dateinamen sind folgende Parameter vorgesehen:
- Qualifier (Laufwerk, bzw. der Teil vor dem Doppelpunkt)
- NoQualifier (Absoluter Pfad ohne Laufwerk)
- Leaf (Dateiname)
- Parent (übergeordnetes Verzeichnis als relativer oder absoluter Pfad)
Split-Path akzeptiert auch Wildcards, die allerdings standardmäßig nicht aufgelöst werden, sondern dann wörtlich im Ergebnis, etwa im Leaf, vorkommen. Dieses Verhalten kann man durch die Verwendung des Parameters Resolve abstellen.
Beispiele
Split-Path -Path .\texte -Resolve -NoQualifier
# Gibt den absoluten Pfad ohne Laufwerk und inklusive Name des Verzeichnisses texte zurück
Split-Path -Path .\texte -Resolve -Qualifier
# Ermittelt das Laufwerk aus dem Pfad zum Verzeichnis texte
Split-Path -Path .\texte -Qualifier
# Fehler, weil ein relativer Pfad ohne -Resolve nicht aufgelöst wird und somit auch keine Laufwerkskennung besitzt
Split-Path -Path .\texte -Resolve -IsAbsolute
# True, weil -Resolve die Ausgabe eines absoluten Pfads bewirkt
Split-Path -Path .\texte\*.docx -Resolve -leaf
# Liefert die reinen Dateinamen aller Word-Dokumente
Split-Path -Path .\texte\*.docx -leaf
# Gibt ohne -Resolve nur "*.docx" zurück
Split-Path -Path .\texte\*.docx
# Spezifiziert man keinen Namensbestandteil, dann ist -parent die
Voreinstellung. Das Ergebnis ist demnach .\texte
Get-Content -Path .\file.lst | Split-Path -Leaf
# Liest den Inhalt von file.lst aus und extrahiert aus jeder Zeile den
Dateinamen
Split-Path beschränkt sich nicht auf das Dateisystem, sondern lässt sich auch auf die Registry und das AD anwenden (siehe dazu: Active Directory in PowerShell als Laufwerk mounten und Objekte bearbeiten).
Befindet man sich etwa in AD:\DC=contoso,DC=com und gibt
split-path "ou=*" -Resolve -leaf
ein, dann erhält man die Namen aller direkt unter Domäne
angesiedelten OUs als Distinguished Names.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links
1 Kommentar
"Again what learnt" (:-)
Danke für die Vorstellung von split-path. Sowas hab ich gerade gesucht und hier gefunden.