EMZETT.
Login

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
CmdletZweck
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-ObjectSumme, Durchschnitt, Minimum, Maximum, Anzahl
Format-Table / Format-ListAnzeige formatieren (nur am Ende der Pipeline!)
Out-File, Export-Csv, ConvertTo-JsonAusgabe speichern/umwandeln

Hinweis

Format-* erzeugt reine Anzeigeobjekte. Setze sie nur ans Ende der Pipeline; für weitere Verarbeitung nutze Select-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 25

Neben 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 | head

Ausgabe:

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
app5

Merke

  • Die Pipeline übergibt Objekte; $_ ist das aktuelle Objekt
  • Where-Object, Select-Object, Sort-Object, Group-Object, Measure-Object, ForEach-Object
  • Format-Table/Format-List nur zur Anzeige am Ende
  • Get-Member entdeckt Eigenschaften und Methoden; alle .NET-Klassen sind nutzbar
  • ConvertTo-Json, ConvertFrom-Json, Export-Csv, Import-Csv für Datenformate

Übungsaufgabe

Erzeuge eine Liste von fünf Objekten mit Name und Preis, filtere die teuren und berechne den Durchschnittspreis.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Variablen, Datentypen und Operatoren

Weiter: Kontrollfluss, Arrays und Hashtables

Alle Kapitel: PowerShell im Überblick