Kurz: In der Pipeline (|) reicht jedes Cmdlet Objekte weiter. Mit Select-Object, Where-Object, Sort-Object, Group-Object und Measure-Object verarbeitest du sie, ohne Text zu parsen.
Teil des Kurses PowerShell
Kapitel 3 von 8 im Kurs PowerShell (Abschnitt „Das Herzstück“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.
Objekte statt Text
In der Pipeline (|) reicht jedes Cmdlet Objekte weiter. Mit Select-Object, Where-Object, Sort-Object, Group-Object und Measure-Object verarbeitest du sie, ohne Text zu parsen.
$leute = @(
[pscustomobject]@{ Name = "Mia"; Alter = 17; Stadt = "Berlin"; Punkte = 120 }
[pscustomobject]@{ Name = "Tom"; Alter = 25; Stadt = "Hamburg"; Punkte = 80 }
[pscustomobject]@{ Name = "Zoe"; Alter = 31; Stadt = "Berlin"; Punkte = 200 }
[pscustomobject]@{ Name = "Ben"; Alter = 9; Stadt = "Köln"; Punkte = 50 }
)
$leute | Where-Object { $_.Alter -ge 18 } | Select-Object -ExpandProperty Name
($leute | Sort-Object Punkte -Descending | Select-Object -First 2).Name -join ", "
$leute | Where-Object Stadt -eq "Berlin" | ForEach-Object { "$($_.Name): $($_.Punkte)" }
$leute | Measure-Object Punkte -Sum -Average -Maximum | ForEach-Object { "$($_.Sum) $($_.Average) $($_.Maximum)" }
$leute | Group-Object Stadt | Sort-Object Name | ForEach-Object { "$($_.Name): $($_.Count)" }
$leute | Select-Object Name, @{ Name = "Doppelt"; Expression = { $_.Punkte * 2 } } | Format-Table -AutoSize | Out-String -Width 60
($leute | Where-Object { $_.Punkte -gt 100 }).Count
$leute.Name
$leute | ForEach-Object -Begin { $summe = 0 } -Process { $summe += $_.Punkte } -End { "Summe $summe" }Ausgabe:
Tom
Zoe
Zoe, Mia
Mia: 120
Zoe: 200
450 112.5 200
Berlin: 2
Hamburg: 1
Köln: 1
Name Doppelt
---- -------
Mia 240
Tom 160
Zoe 400
Ben 100
2
Mia
Tom
Zoe
Ben
Summe 450| Cmdlet | Zweck |
|---|---|
Where-Object (?) | filtern: Where-Object { $_.Alter -gt 18 } oder kurz Where-Object Alter -gt 18 |
Select-Object (select) | Eigenschaften wählen, -First, -Last, -ExpandProperty, berechnete Spalten |
Sort-Object (sort) | sortieren, -Descending, mehrere Schlüssel |
ForEach-Object (%) | auf jedes Objekt etwas anwenden |
Group-Object (group) | gruppieren |
Measure-Object | Summe, Durchschnitt, Minimum, Maximum, Anzahl |
Format-Table / Format-List | Anzeige formatieren (nur am Ende der Pipeline!) |
Out-File, Export-Csv, ConvertTo-Json | Ausgabe speichern/umwandeln |
Hinweis
Format-*erzeugt reine Anzeigeobjekte. Setze sie nur ans Ende der Pipeline; für weitere Verarbeitung nutzeSelect-Object.
Eigenschaften und Methoden
$datum = Get-Date -Year 2025 -Month 3 -Day 15 -Hour 14 -Minute 30 -Second 0
$datum.Year; $datum.DayOfWeek; $datum.AddMonths(2).ToString("yyyy-MM-dd"); $datum.DayOfYear
$text = "Pipeline"
$text | Get-Member -MemberType Property, Method | Select-Object -First 3 -ExpandProperty Name
$liste = [System.Collections.Generic.List[int]]::new()
$liste.Add(3); $liste.Add(1); $liste.Add(2)
$liste.Sort(); $liste -join ","
[System.IO.Path]::GetExtension("bericht.txt")
[Math]::Round(3.14159, 2)
[Guid]::NewGuid().ToString().Length
[Environment]::OSVersion.Platform -in "Unix", "Win32NT"
(1..5 | ForEach-Object { $_ * $_ }) -join " "Ausgabe:
2025
Saturday
2025-05-15
74
Clone
CompareTo
Contains
1,2,3
.txt
3.14
36
True
1 4 9 16 25Neben den Cmdlets stehen alle .NET-Klassen zur Verfügung: [Math]::Sqrt(), [IO.File]::ReadAllText(), [DateTime]::Now. Dadurch ist PowerShell sehr mächtig.
Die Pipeline im Alltag
# Prozesse nach Speicher (Beispiel mit eigenen Objekten, damit die Ausgabe stabil bleibt)
$prozesse = 1..5 | ForEach-Object { [pscustomobject]@{ Name = "app$_"; MB = $_ * 100 + ($_ % 2) * 50 } }
$prozesse | Sort-Object MB -Descending | Select-Object -First 3 | ForEach-Object { "{0,-6} {1,5} MB" -f $_.Name, $_.MB }
# CSV und JSON
$csv = $prozesse | ConvertTo-Csv -NoTypeInformation
$csv[0..2]
($prozesse | Select-Object -First 2 | ConvertTo-Json -Compress)
$zurueck = '[{"a":1,"b":"x"},{"a":2,"b":"y"}]' | ConvertFrom-Json
$zurueck.Count; $zurueck[1].b; ($zurueck | Measure-Object a -Sum).Sum
$csv | ConvertFrom-Csv | Where-Object { [int]$_.MB -gt 400 } | Select-Object -ExpandProperty Name
# Vergleich: Text-Pipeline in Bash wäre: ps | sort -k4 | headAusgabe:
app5 550 MB
app4 400 MB
app3 350 MB
"Name","MB"
"app1","150"
"app2","200"
[{"Name":"app1","MB":150},{"Name":"app2","MB":200}]
2
y
3
app5Merke
- Die Pipeline übergibt Objekte;
$_ist das aktuelle Objekt Where-Object,Select-Object,Sort-Object,Group-Object,Measure-Object,ForEach-ObjectFormat-Table/Format-Listnur zur Anzeige am EndeGet-Memberentdeckt Eigenschaften und Methoden; alle .NET-Klassen sind nutzbarConvertTo-Json,ConvertFrom-Json,Export-Csv,Import-Csvfür Datenformate
Übungsaufgabe
Erzeuge eine Liste von fünf Objekten mit Name und Preis, filtere die teuren und berechne den Durchschnittspreis.
Quiz zur Selbstkontrolle
Was ist $_ in der Pipeline?
- Das aktuelle Objekt (richtig)
- Die letzte Fehlermeldung
- Der Skriptname
- Ein Unterstrich-Operator
Wohin gehört Format-Table?
- Ans Ende der Pipeline (richtig)
- An den Anfang
- In die Mitte
- Überall
Was liefert Where-Object?
- Nur die Objekte, auf die die Bedingung zutrifft (richtig)
- Die Anzahl der Objekte
- Alle Objekte sortiert
- Eine Liste der Eigenschaften
Weiter im Kurs
Zurück: Variablen, Datentypen und Operatoren
Weiter: Kontrollfluss, Arrays und Hashtables
Alle Kapitel: PowerShell im Überblick