Zum Inhalt springen

Filtern, Sortieren, Auswählen

Core
Lernziele
  • Objekte mit Where-Object filtern
  • Mit Sort-Object und Select-Object Ergebnisse ordnen und kürzen

PowerShell bietet mit Where-Object, Sort-Object und Select-Object drei leistungsfähige Cmdlets, die dir helfen, Daten in der Pipeline zu filtern, zu sortieren und gezielt auszuwählen. Diese Befehle sind essenziell, um große Datenmengen effizient zu verarbeiten und nur die relevanten Informationen anzuzeigen.

Du kennst die drei Cmdlets schon aus der Pipeline-Einführung. Jetzt lernst du sie genau kennen. Voraussetzung sind die Vergleichsoperatoren aus dem vorigen Kapitel.

Mit Where-Object filterst du Objekte, indem du eine Bedingung im Skriptblock definierst. Jedes Objekt, das den Filter passiert, wird an die nächste Pipeline-Stufe weitergegeben.

Terminal-Fenster
# Einfache Form: Eigenschaft, Operator, Wert
Get-Service | Where-Object Status -eq 'Running'
# Skriptblock-Form: $_ ist das aktuelle Objekt, nötig für zusammengesetzte Bedingungen
Get-Service | Where-Object { $_.Status -eq 'Running' -and $_.Name -like 'W*' }

1.1 Beispiel: Filterung von Prozessen nach Arbeitsspeicher

Abschnitt betitelt „1.1 Beispiel: Filterung von Prozessen nach Arbeitsspeicher“
Terminal-Fenster
# Filtert alle Prozesse, die mehr als 100 MB Arbeitsspeicher verwenden
Get-Process | Where-Object { $_.WorkingSet -gt 100MB }
Terminal-Fenster
# Filtert alle Prozesse, deren Namen mit "P" beginnen
Get-Process | Where-Object { $_.Name -like "P*" }

Mit Sort-Object sortierst du die Objekte in der Pipeline basierend auf einer oder mehreren Eigenschaften. Dabei kannst du optional die Sortierreihenfolge mit dem Parameter -Descending umkehren.

2.1 Beispiel: Sortierung von Prozessen nach CPU-Auslastung

Abschnitt betitelt „2.1 Beispiel: Sortierung von Prozessen nach CPU-Auslastung“
Terminal-Fenster
# Sortiert Prozesse in absteigender Reihenfolge nach der CPU-Auslastung
Get-Process | Sort-Object CPU -Descending
Terminal-Fenster
# Sortiert zunächst nach CPU und dann nach dem Namen des Prozesses
Get-Process | Sort-Object CPU, Name

Mit Select-Object wählst du gezielt Eigenschaften aus den Objekten aus oder begrenzt die Anzahl der ausgegebenen Objekte. Dies hilft dabei, die Ausgabe übersichtlich zu gestalten.

Terminal-Fenster
# Wählt nur die Eigenschaften Name, CPU und Id der Prozesse aus
Get-Process | Select-Object Name, CPU, Id
Terminal-Fenster
# Gibt nur die ersten 5 Prozesse zurück
Get-Process | Select-Object -First 5

Die wahre Stärke dieser Cmdlets zeigt sich, wenn sie kombiniert werden, um komplexe Datenverarbeitungsaufgaben zu lösen:

Terminal-Fenster
# Filtert Prozesse mit mehr als 50 Sekunden CPU-Zeit, sortiert sie absteigend
# und gibt die Top 5 mit den Eigenschaften Name, CPU und Id aus
Get-Process |
Where-Object { $_.CPU -gt 50 } |
Sort-Object CPU -Descending |
Select-Object -First 5 -Property Name, CPU, Id
Terminal-Fenster
Get-Service | Measure-Object # Anzahl
Get-ChildItem C:\Kurs\Daten -File | Measure-Object -Property Length -Sum
Terminal-Fenster
Get-Service | Group-Object Status | Select-Object Name, Count

Mit einer Hashtable legst du eine neue Spalte an: Name ist der Spaltenname, Expression rechnet den Wert aus ($_ ist das aktuelle Objekt).

Terminal-Fenster
Get-Process |
Select-Object Name, @{ Name = 'SpeicherMB'; Expression = { [math]::Round($_.WorkingSet / 1MB, 1) } } -First 5
Terminal-Fenster
Get-Date # jetzt
(Get-Date).AddDays(-7) # vor sieben Tagen
Get-ChildItem C:\Kurs\Daten\Logs | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }
  • Frühzeitiges Filtern:
    Setze Where-Object möglichst früh in der Pipeline ein. Noch besser: Filtere schon im Cmdlet selbst, wenn es einen Parameter dafür gibt (Get-Service -Name W* statt Get-Service | Where-Object Name -like 'W*'). Das ist schneller, vor allem bei Remote-Abfragen.

  • Lesbare Pipelines:
    Zerlege komplexe Pipelines in mehrere Zeilen und kommentiere wichtige Schritte, um die Lesbarkeit zu erhöhen.

  • Gezielte Auswahl:
    Verwende Select-Object, um nur die relevanten Informationen zu extrahieren – das erleichtert die Weiterverarbeitung und Ausgabe.

  • Where-Object:
    Ermöglicht das Filtern von Objekten basierend auf Bedingungen.

  • Sort-Object:
    Sortiert die Objekte in der Pipeline nach den gewünschten Eigenschaften.

  • Select-Object:
    Wählt spezifische Eigenschaften aus oder begrenzt die Anzahl der ausgegebenen Objekte.

Diese Cmdlets sind zentrale Werkzeuge in PowerShell, mit denen du komplexe Datenströme effizient bearbeiten und nur die für dich relevanten Informationen extrahieren kannst.