Split-Path, Get-ChildItem: Dateinamen zerlegen in PowerShell

    String-Manipulation in PowerShellBei 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.

    Keine Kommentare