# Split-Path

`Split-Path` zerlegt einen Pfad in einzelne Bestandteile oder gibt gezielt einen bestimmten Bestandteil eines Pfades zurück.

Der Befehl kann beispielsweise verwendet werden, um aus einem vollständigen Dateipfad nur den **Ordner**, den **Dateinamen** oder den **übergeordneten Pfad** zu ermitteln.

---

# Grundlagen

## Syntax

```powershell
Split-Path [-Path] <String[]> [-Qualifier] [-NoQualifier] [-Parent] [-Leaf] [-Resolve] [-Credential <PSCredential>]
```

Alternativ kann ein Pfad über `-LiteralPath` angegeben werden:

```powershell
Split-Path [-LiteralPath] <String[]> [-Qualifier] [-NoQualifier] [-Parent] [-Leaf] [-Resolve] [-Credential <PSCredential>]
```

Der wichtigste Unterschied zwischen `-Path` und `-LiteralPath` besteht darin, dass `-Path` Wildcards interpretiert, während `-LiteralPath` den angegebenen Pfad exakt verwendet.

---

## Beschreibung

`Split-Path` arbeitet ausschließlich mit der **Struktur eines Pfades**. Der Befehl greift dabei nicht grundsätzlich auf das Dateisystem zu.

Beispielsweise:

```powershell
Split-Path "C:\Users\Jonny\Dokumente\Test.txt"
```

Ausgabe:

```text
C:\Users\Jonny\Dokumente
```

Ohne weitere Angabe wird standardmäßig der **übergeordnete Pfad** zurückgegeben.

Je nach verwendeter Option kann `Split-Path` aber auch andere Bestandteile ermitteln:

| Option         | Ergebnis                              |
| -------------- | ------------------------------------- |
| keine Option   | Übergeordneter Pfad                   |
| `-Parent`      | Übergeordneter Pfad                   |
| `-Leaf`        | Letzter Bestandteil des Pfades        |
| `-Qualifier`   | Laufwerk bzw. Pfadqualifizierer       |
| `-NoQualifier` | Pfad ohne Laufwerk bzw. Qualifizierer |
| `-Resolve`     | Aufgelöster Pfad                      |

---

# Parameter

| Parameter      | Typ               | Beschreibung                                                                            |
| -------------- | ----------------- | --------------------------------------------------------------------------------------- |
| `-Path`        | `String[]`        | Gibt den zu zerlegenden Pfad an. Wildcards werden unterstützt.                          |
| `-LiteralPath` | `String[]`        | Gibt den Pfad exakt an. Wildcards werden nicht interpretiert.                           |
| `-Parent`      | `SwitchParameter` | Gibt den übergeordneten Bestandteil des Pfades zurück.                                  |
| `-Leaf`        | `SwitchParameter` | Gibt den letzten Bestandteil des Pfades zurück.                                         |
| `-Qualifier`   | `SwitchParameter` | Gibt den Qualifizierer des Pfades zurück, beispielsweise `C:`.                          |
| `-NoQualifier` | `SwitchParameter` | Entfernt den Qualifizierer aus dem Pfad.                                                |
| `-Resolve`     | `SwitchParameter` | Löst den Pfad auf und gibt den tatsächlichen Pfad zurück.                               |
| `-Credential`  | `PSCredential`    | Gibt die Anmeldeinformationen an, die beim Auflösen des Pfades verwendet werden sollen. |

---

# Bestandteile eines Pfades

## Parent

`-Parent` gibt den übergeordneten Pfad zurück.

```powershell
Split-Path "C:\Users\Jonny\Dokumente\Test.txt" -Parent
```

Ausgabe:

```text
C:\Users\Jonny\Dokumente
```

Das entspricht auch dem Standardverhalten von `Split-Path`:

```powershell
Split-Path "C:\Users\Jonny\Dokumente\Test.txt"
```

---

## Leaf

`-Leaf` gibt den letzten Bestandteil des Pfades zurück.

Bei einem Dateipfad ist dies normalerweise der **Dateiname**.

```powershell
Split-Path "C:\Users\Jonny\Dokumente\Test.txt" -Leaf
```

Ausgabe:

```text
Test.txt
```

Bei einem Ordnerpfad wird entsprechend der letzte Ordner zurückgegeben:

```powershell
Split-Path "C:\Users\Jonny\Dokumente" -Leaf
```

Ausgabe:

```text
Dokumente
```

---

## Qualifier

`-Qualifier` gibt den Qualifizierer eines Pfades zurück.

Bei einem lokalen Windows-Pfad ist dies normalerweise das Laufwerk:

```powershell
Split-Path "C:\Users\Jonny\Dokumente\Test.txt" -Qualifier
```

Ausgabe:

```text
C:
```

Bei anderen Pfadtypen kann der Qualifizierer entsprechend anders aussehen.

---

## NoQualifier

`-NoQualifier` entfernt den Qualifizierer aus dem Pfad.

```powershell
Split-Path "C:\Users\Jonny\Dokumente\Test.txt" -NoQualifier
```

Ausgabe:

```text
\Users\Jonny\Dokumente\Test.txt
```

Damit kann beispielsweise ein Pfad ohne Laufwerksbuchstaben erzeugt werden.

---

# Wildcards

Der Parameter `-Path` unterstützt Wildcards.

Beispielsweise:

```powershell
Split-Path "C:\Users\Jonny\*.txt" -Leaf
```

Dabei wird `*.txt` als Wildcard interpretiert.

Soll der Pfad dagegen **wörtlich** behandelt werden, wird `-LiteralPath` verwendet:

```powershell
Split-Path -LiteralPath "C:\Users\Jonny\*.txt" -Leaf
```

Hier wird `*.txt` nicht als Platzhalter interpretiert.

> 💡 **Hinweis**
> Der Unterschied zwischen `-Path` und `-LiteralPath` ist besonders relevant, wenn ein Pfad Zeichen enthält, die PowerShell als Wildcards interpretiert.

---

# Resolve

Mit `-Resolve` wird der angegebene Pfad aufgelöst.

```powershell
Split-Path "C:\Users\Jonny\Dokumente\..\Test.txt" -Resolve
```

Dadurch kann beispielsweise ein Pfad mit relativen Bestandteilen wie `..` auf seinen tatsächlichen Pfad reduziert werden.

`-Resolve` arbeitet dabei mit dem PowerShell-Provider-System und kann deshalb auch für andere Provider als das Dateisystem relevant sein.

---

# Mehrere Pfade

`Split-Path` akzeptiert mehrere Pfade über `-Path`.

```powershell
$paths = @(
    "C:\Test\Datei1.txt"
    "C:\Test\Datei2.txt"
    "C:\Test\Datei3.txt"
)

Split-Path $paths -Leaf
```

Ausgabe:

```text
Datei1.txt
Datei2.txt
Datei3.txt
```

Das ist besonders praktisch, wenn mehrere Pfade aus einer Pipeline oder einer Variablen verarbeitet werden sollen.

---

# Verwendung mit der Pipeline

`Split-Path` kann Pfade auch über die Pipeline verarbeiten.

```powershell
Get-ChildItem "C:\Test" | Split-Path -Parent
```

Da `Get-ChildItem` Objekte liefert, ist bei komplexeren Szenarien häufig die explizite Übergabe des Pfades sinnvoll:

```powershell
Get-ChildItem "C:\Test" |
    ForEach-Object {
        Split-Path $_.FullName -Parent
    }
```

Hier wird für jedes gefundene Objekt dessen vollständiger Pfad an `Split-Path` übergeben.

---

# Typische Anwendungsfälle

`Split-Path` wird häufig verwendet, um:

* den Ordner einer Datei zu ermitteln
* den Dateinamen aus einem Pfad zu extrahieren
* den Laufwerksbuchstaben zu bestimmen
* Pfade ohne Laufwerksbuchstaben zu erzeugen
* Pfade vor der weiteren Verarbeitung zu zerlegen
* mehrere Pfade automatisiert zu verarbeiten

Ein typisches Beispiel ist das Ermitteln des Verzeichnisses einer Datei:

```powershell
$file = "C:\Users\Jonny\Dokumente\Test.txt"

$directory = Split-Path $file -Parent

$directory
```

Ausgabe:

```text
C:\Users\Jonny\Dokumente
```

---

# Rückgabewert

`Split-Path` gibt einen oder mehrere **Strings** zurück.

Der genaue Inhalt hängt von der verwendeten Option ab.

| Option         | Beispiel            | Rückgabe          |
| -------------- | ------------------- | ----------------- |
| `-Parent`      | `C:\Test\Datei.txt` | `C:\Test`         |
| `-Leaf`        | `C:\Test\Datei.txt` | `Datei.txt`       |
| `-Qualifier`   | `C:\Test\Datei.txt` | `C:`              |
| `-NoQualifier` | `C:\Test\Datei.txt` | `\Test\Datei.txt` |
| `-Resolve`     | auflösbarer Pfad    | Aufgelöster Pfad  |

---

# Beispiele

## Dateiname ermitteln

```powershell
$path = "C:\Projekte\Projekt1\script.ps1"

Split-Path $path -Leaf
```

Ausgabe:

```text
script.ps1
```

## Verzeichnis ermitteln

```powershell
Split-Path $path -Parent
```

Ausgabe:

```text
C:\Projekte\Projekt1
```

## Laufwerk ermitteln

```powershell
Split-Path $path -Qualifier
```

Ausgabe:

```text
C:
```

## Pfad ohne Laufwerk

```powershell
Split-Path $path -NoQualifier
```

Ausgabe:

```text
\Projekte\Projekt1\script.ps1
```

---

# Hinweise

* `Split-Path` **zerlegt Pfade**, anstatt Dateien oder Ordner zu verändern.
* Ohne eine entsprechende Option wird standardmäßig der **Parent-Pfad** zurückgegeben.
* `-Leaf` eignet sich besonders zum Ermitteln eines Dateinamens.
* `-Parent` eignet sich zum Ermitteln des Verzeichnisses einer Datei.
* `-Path` unterstützt Wildcards.
* `-LiteralPath` behandelt den angegebenen Pfad wörtlich.
* Mit `-Resolve` kann ein Pfad tatsächlich aufgelöst werden.
* Der Befehl arbeitet mit dem **PowerShell-Provider-System** und ist deshalb nicht ausschließlich auf das Dateisystem beschränkt.

---

# Siehe auch

* `Join-Path`
* `Resolve-Path`
* `Convert-Path`
* `Get-Item`
* `Get-ChildItem`