Wie man Pfade mit dem PowerShell Split-Path Cmdlet aufteilt

Müssen Sie Pfade aufteilen, um bestimmte Teile davon zu erhalten? Wenn ja, dann können Sie sich auf PowerShell Split-Path verlassen. Wenn Sie mit Dateien, Zertifikaten und der Registrierung arbeiten, werden Sie feststellen, dass Pfade ihre Speicherorte darstellen.

Und irgendwann müssen Sie möglicherweise filtern, welcher Teil eines Pfades zurückgegeben werden soll, vielleicht bei der Automatisierung. Glücklicherweise wird Ihnen dieses Tutorial verschiedene Möglichkeiten zeigen, wie Sie das PowerShell Split-Path Cmdlet verwenden können, um dies zu tun.

Los geht’s! Lesen Sie weiter und lassen Sie uns Ihnen eine neue Waffe für Ihren PowerShell-Arsenal geben!

Voraussetzungen

Wenn Sie die Beispiele in diesem praxisorientierten Tutorial ausprobieren möchten, benötigen Sie einen Computer mit einer beliebigen aktuellen Version von Windows, auf dem PowerShell 5.1 oder höher ausgeführt wird. In diesem Tutorial wird Windows 10 20H2 mit PowerShell 7.1.1 verwendet.

Was steckt in einem Pfad?

Bevor wir uns ausführlich mit dem PowerShell Split-Path Cmdlet beschäftigen, stellen wir sicher, dass Sie wissen, was ein Pfad ist. Ein Pfad bestimmt den Speicherort eines Elements, das einem bestimmten Format folgt.

Zum Beispiel könnte der Pfad einer Datei C:\demo\subfolder1\TestFile_11.txt sein. Wenn Sie diesen Pfad in Teile aufteilen, enthält der Pfad Folgendes:

  • C: is the drive or the qualifier, or the specified path. The qualifier is the part of the path from the left up to the colon (:) character.
  • \demo\subfolder1\ ist der Ordner und die Unterordner oder Container.
  • TestFile_11.txt ist der Dateiname oder das Blatt. Das Blatt ist das letzte Element oder Teil eines Pfades.

Denken Sie daran, dass Pfade nicht ausschließlich auf Dateien und Ordner beschränkt sind. Andere gültige Pfade können beinhalten:

  • Zertifikat (z. B. Cert:\CurrentUser\My)
  • Registrierung (z. B. HKCU:\Software)
  • Funktion (z. B. Function:\New-Guid)
  • Variable (z. B. Variable:\PSEdition)
  • Active Directory (z. B. AD:\CN=Benutzer,DC=Constoso,DC=com)

Die PowerShell Split-Path-Parameter

Wie jeder Cmdlet wird Split-Path mit einem Satz von Parametern geliefert, die beeinflussen, wie sich das Cmdlet verhält und seinen Ausgabewert zurückgibt. Und diese Parameter bilden die Syntax von PowerShell Split-Path.

  • -Path – Dieser Parameter akzeptiert einen oder mehrere Pfadzeichenfolgen, die Sie aufteilen möchten. Dieser Parameter akzeptiert auch Pipeline-Eingaben. Platzhalter in Pfaden sind ebenfalls akzeptabel.
  • -LiteralPath – Wie der -Path-Parameter akzeptiert auch der -LiteralPath-Parameter Pfade zum Aufteilen. Dieser Parameter behandelt den Pfad jedoch nur so, wie er geschrieben wurde. Das bedeutet, dass das Kommando Platzhalter nicht interpretiert, wenn Sie diesen Parameter zum Angeben von Pfaden verwenden.
  • -Resolve – Dieser Parameter teilt dem Split-Path-Cmdlet mit, die Dateien oder Elemente aufzulösen, auf die der von Ihnen bereitgestellte Pfad verweist. Aufgrund seiner wörtlichen Natur können Sie diesen Parameter nicht zusammen mit dem -LiteralPath-Parameter verwenden.
  • -IsAbsolute – Dieser Parameter gibt einen booleschen Wert zurück, um festzustellen, ob der angegebene Pfad ein absoluter Pfad ist oder nicht.

Das PowerShell Split-Path-Cmdlet verfügt ebenfalls über einen Parameter namens -Credential, der angeblich ein Anmeldeinformations-PSCredential-Objekt akzeptiert. Aber laut Microsoft wird dieser Parameter von keinem der integrierten PowerShell-Anbieter unterstützt und führt zu einem Fehler, wenn er verwendet wird.

Die folgenden Parameter werden als die Split Location Parameters bezeichnet. Diese Parameter geben dem PowerShell Split-Path-Cmdlet an, welches Element oder welcher Teil eines Pfads zurückgegeben werden soll. Da das Cmdlet nur ein Element eines Pfads zurückgeben kann, können Sie jeweils nur einen dieser Parameter verwenden.

  • -Parent – Gibt den übergeordneten Speicherort (ohne das Element oder den Dateinamen) des angegebenen Pfads zurück. Dieser Parameter ist auch der Standard-Split-Location-Parameter, was bedeutet, dass Sie diesen Parameter weglassen können und trotzdem den übergeordneten Speicherort als Ergebnis erhalten.
  • -Leaf – Gibt nur das letzte Element des Pfads oder das Blatt zurück.
  • -LeafBase – Gibt nur das letzte Element des Pfads oder das Blatt ohne Erweiterung zurück. Dieser Parameter ist nur in PowerShell 6.0 und höher verfügbar.
  • -Extension – Gibt nur die Erweiterung des Blattes zurück (vom letzten Punkt „.“ bis zum letzten Zeichen des Pfads). Dieser Parameter steht nur in PowerShell 6.0 und höher zur Verfügung.
  • -Qualifier – Gibt nur das Laufwerk oder den Qualifier des Pfads zurück.
  • -NoQualifier – Entfernt das Laufwerk oder den Qualifier aus dem restlichen Pfad.

Verwendung des PowerShell Split-Path-Cmdlets (Beispiele)

Das PowerShell Split-Path-Cmdlet ermöglicht es Ihnen, Teile eines Pfads zu trennen und zu zerlegen. Anschließend können Sie angeben, welchen Teil eines Pfads Sie zurückgeben möchten. Je nach Ausgabeanforderung können Sie den Qualifier, den Pfad ohne Qualifier und Dateiname(n) auswählen.

Holen des übergeordneten Ordners eines Pfads

Um den übergeordneten Ordner des Pfads zurückzugeben, führen Sie das PowerShell Split-Path-Cmdlet aus und fügen Sie den Parameter -Parent hinzu.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Parent

Das Ergebnis unten zeigt, dass der Befehl den Pfad des übergeordneten Ordners zurückgibt.

Returning the parent containers of the Item

Tipp: Das Ausführen des PowerShell Split-Path-Cmdlets ohne Parameter gibt standardmäßig den übergeordneten Ordner zurück, das gleiche Verhalten wie bei Verwendung des Parameters -Parent.

Tipp: Der Parameter -Path akzeptiert mehrere Pfade, was es Ihnen ermöglicht, mehrere Pfadzeichenfolgen in einem einzigen Befehl zu trennen.

e.g., Split-Path -Path 'c:\folder1','c:\folder2'

Anzeigen eines Pfads ohne Qualifier

Stellen Sie sich vor, Sie erstellen ein Skript, das eine Ordnerbaumstruktur von einem Laufwerk auf ein anderes dupliziert (z. B. C:\demo\subfolder1 nach D:\demo\subfolder1). Möglicherweise möchten Sie, dass Ihr Code den Quellpfad aufteilt und nur die Ordnerstruktur ohne den Laufwerksbuchstaben erhält.

Um den Pfad ohne Qualifikator zu erhalten, führen Sie das PowerShell Split-Path-Cmdlet mit dem -NoQualifier-Parameter aus, wie im folgenden Befehl. Dieser Befehl teilt den Pfad und lässt dabei den Laufwerksbuchstaben im Ergebnis weg.

Split-Path -Path C:\demo\subfolder1 -NoQualifier

Wie aus dem untenstehenden Ergebnis ersichtlich ist, gibt die Verwendung des Parameters noQualifier den Pfad, jedoch ohne den Qualifikatorstring, zurück.

Returning the Path Without the Qualifier

Das Abrufen des Laufwerks oder Qualifikators eines Pfads

Es gibt möglicherweise Situationen, in denen Sie nur den Qualifikator oder den Laufwerksbuchstaben zurückgeben müssen. Zum Beispiel, wenn Sie möchten, dass Ihr Skript die Ergebnisse basierend auf Laufwerksbuchstaben zusammenfasst.

Und um dies zu tun, führen Sie den PowerShell-Befehl Split-Path unten mit dem -Qualifier-Parameter aus. Dieser Befehl teilt den Pfad auf und gibt nur den Qualifikatorstring als Ergebnis zurück.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Qualifier
Returning the Path’s Drive or Qualifier

Anzeigen des Namens einer Datei, eines Verzeichnisses oder eines Elements

Denken Sie an einen Pfad als einen Baum. Der Qualifikator ist der Baum selbst, Ordner sind die Äste, und am Ende finden Sie das Blatt. Ein Blatt ist ein nicht-nuller Zeichenfolgenwert am Ende des Pfads.

Wenn Sie einen Pfad aufteilen müssen, um das Blatt zu erhalten, führen Sie den Split-Path-Befehl unten aus und fügen Sie den Parameter -Leaf hinzu.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Leaf

Als Ergebnis zeigt das Bild unten, dass der Befehl nur den Dateinamen aus dem angegebenen Pfad zurückgegeben hat.

Returning the Path’s Leaf

Trennen des Dateinamens und der Erweiterung (≥PowerShell 6.0)

Hinweis: Dieser Abschnitt gilt für PowerShell 6.0 und höher.

Sie haben also den Pfad geteilt und den Gegenstand zurückgegeben. Und der Gegenstand ist in diesem Fall ein Dateiname (TestFile_11.txt), der aus zwei Teilen besteht – der Basis und der Erweiterung. Die PowerShell Split-Path cmdlet ermöglicht es Ihnen, das Blatt weiter in diese beiden Teile mit dem -LeafBase und -Extension Parameter zu teilen.

Um die Basis und die Erweiterung eines Dateinamens zu erhalten, führen Sie die folgenden Befehle aus.

Wenn der Pfad keine Erweiterung hat, gibt der Extension Parameter eine leere Zeichenkette zurück.

Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -LeafBase
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -Extension
Splitting the Leaf’s Base and Extension

Trennen des Dateinamens und der Erweiterung (≤ Windows PowerShell 5.1)

Leider sind die -LeafBase und -Extension Parameter in Windows PowerShell 5.1 und niedrigeren Versionen nicht verfügbar. Keine Sorge, mit etwas PowerShell Magie können Sie die Ausgabe dieser Parameter sogar replizieren, wenn Sie nur Windows PowerShell 5.1 haben.

Aber anstelle der Split-Path cmdlet, verwenden Sie das nächstbeste – die Kombination der split() Methode und des -replace Operators.

A PowerShell string object, such as the path, contains a split() method. This method allows you to split a string into multiple elements based on a delimiter character that you provide. And in the case of paths, the delimiter is the (\\) back-slash character.

Andererseits ermöglicht Ihnen der -replace-Operator, Zeichenfolgen mithilfe von regulären Ausdrücken (RegEx) zu ersetzen.

Um die Ergebnisse des Parameters -LeafBase nachzuahmen, führen Sie den folgenden Befehl in PowerShell aus.

# Teilen Sie den Pfad ('C:\demo\subfolder1\TestFile_11.txt') mit '\' als Trennzeichen.
# Wählen Sie das letzte '[-1]' Element nach der Trennung aus (TestFile_11.txt)
# Suchen Sie den String, der diesem Muster entspricht --> '\.[^.]*$'
# ^ dieses Muster entspricht dem letzten Punkt "." im Pfad UND jedem anderen Zeichen danach.
# Ersetzen Sie dann die Übereinstimmung durch nichts/leeren Wert ''.
('C:\demo\subfolder1\TestFile_11.txt').split('\')[-1] -replace '\.[^.]*$',''

Als Ergebnis zeigt der Screenshot unten, dass der Befehl nur den Basisnamen der Datei zurückgegeben hat.

Getting the file base in PowerShell 5.1

Um nur die Dateierweiterung zu erhalten, führen Sie den folgenden Befehl in PowerShell aus.

# Teilen Sie den Pfad ('C:\demo\subfolder1\TestFile_11.txt') mit '.' als Trennzeichen.
# Wählen Sie das letzte '[-1]' Element nach der Trennung aus (txt)
('C:\demo\subfolder1\TestFile_11.txt').split('.')[-1]

Das Ergebnis unten zeigt, dass der Befehl nur die Dateierweiterung zurückgegeben hat – txt.

Getting the file extension in PowerShell ≤ 5.1

Feststellen, ob der Pfad absolut ist

Als Systemadministrator stoßen Sie auf zwei Arten von Pfaden—absolut und relativ. Aber was ist der Unterschied? Ein absoluter Pfad beginnt mit einem Qualifikator, wie C:\demo oder HKCU:\Software. Im Gegensatz dazu hat ein relativer Pfad keinen Qualifikator, wie .\demo oder \folder1\folder2.

Das PowerShell Split-Path Cmdlet kann Ihnen helfen, einen absoluten Pfad mithilfe des Parameters -IsAbsolute zu identifizieren. Führen Sie die folgenden Befehle aus, um festzustellen, ob der Pfad absolut ist.

# Dieser Pfad ist absolut
Split-Path -Path C:\demo\subfolder1\TestFile_11.txt -IsAbsolute
# Dieser Pfad ist relativ
Split-Path -Path .\demo\subfolder1\TestFile_11.txt -IsAbsolute

Wie Sie unten sehen können, gibt der -isAbsolute Parameter einen booleschen Wert zurück, um anzuzeigen, ob der Pfad absolut (TRUE) oder relativ (FALSE) ist.

Determining if the Path is Absolute

Pfade mit Platzhaltern aufteilen und auflösen

Bis jetzt müssen die Pfade, die Sie mit dem Split-Path Cmdlet aufteilen, nicht existierende Pfade sein. Unabhängig davon, ob ein Pfad existiert oder nicht, teilt Ihnen dieses Cmdlet den Ergebnis mit.

Aber das PowerShell Split-Path Cmdlet hat einen weiteren Parameter namens -Resolve. Dieser Parameter ermöglicht es Ihnen, die durch Platzhalter referenzierten Elemente aufzulösen. Wenn Sie diesen Parameter verwenden möchten, müssen der aufzuteilende Pfad und die darin enthaltenen Elemente bereits vorhanden sein.

Zum Beispiel, um die Elemente mit der Dateierweiterung *.txt zurückzugeben, führen Sie den folgenden Befehl aus. Der -Leaf Parameter stellt sicher, dass das Cmdlet nur die Elemente und nicht die übergeordneten Container zurückgibt.

Das (*) Platzhalterzeichen repräsentiert ein oder mehrere Zeichen zur Übereinstimmung, während (?) ein Platzhalterzeichen für ein einzelnes Zeichen darstellt.

Split-Path -Path C:\demo\subfolder1\*.txt -Leaf -Resolve

Das unten stehende Ergebnis listet die Dateien TestFile_11.txt bis TestFile_20.txt auf. Diese Dateien haben alle zur .txt Dateierweiterung gepasst.

Resolving matching filenames

Um eine Übereinstimmung für ein einzelnes Zeichen zu erzielen, ersetzen Sie das Asteriskum (*) Wildcard durch das (?) Wildcard, wie im folgenden Befehl.

Split-Path -Path C:\demo\subfolder1\TestFile_2?.txt -Resolve -Leaf

Die Ausgabe unten zeigt nur die Datei TestFile_20.txt, weil diese Datei die einzige ist, die übereinstimmt.

Resolving matching single character

Wenn der Pfad ein Escape-Zeichen enthält, wie das Grave-Akzent („`), schließen Sie den Pfad in einfache Anführungszeichen ein, um den Pfad aufzulösen. Zum Beispiel spaltet und löst der folgende Befehl einen Pfad mit einem Escape-Zeichen auf.

Split-Path -Path 'C:\demo\subfolder1\dir`n\TestFile_2?.txt' -Leaf -Resolve
Splitting and Resolving a Path with Escape Characters

Als Proof of Concept, wenn Sie diesen Pfad nicht in einfache Anführungszeichen einschließen, gibt der Befehl einen Fehler zurück, dass der Pfad nicht existiert. Der gleiche Fehler tritt auf, wenn Sie stattdessen doppelte Anführungszeichen verwenden.

Split-Path -Path C:\demo\subfolder1\dir`n\TestFile_2?.txt -Leaf -Resolve
Split-Path -Path "C:\demo\subfolder1\dir`n\TestFile_2?.txt" -Leaf -Resolve
Resolving a Path without enclosing single quotation marks

Fazit

Das PowerShell Split-Path-Cmdlet ist ein unverzichtbares Werkzeug für Systemadministratoren und Benutzer gleichermaßen. Dieses Tutorial soll Ihnen zeigen, wie das Split-Path-Cmdlet jeden gegebenen Pfad aufteilen und bestimmte Elemente zurückgeben kann, basierend auf dem verwendeten Parameter.

Haben Sie das Split-Path-Cmdlet bereits in Ihren Aufgaben verwendet? Falls nicht, hat Sie dieses Tutorial überzeugt, es in Ihren manuellen oder automatisierten Jobs zu verwenden? Oder kennen Sie eine andere Methode, um Pfade besser aufzuteilen als das PowerShell Split-Path?

Source:
https://adamtheautomator.com/powershell-split-path/