Filtern, Sortieren, Auswählen
- Objekte mit
Where-Objectfiltern - Mit
Sort-ObjectundSelect-ObjectErgebnisse 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.
1. Where-Object
Abschnitt betitelt „1. Where-Object“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.
1.0 Zwei Schreibweisen
Abschnitt betitelt „1.0 Zwei Schreibweisen“# Einfache Form: Eigenschaft, Operator, WertGet-Service | Where-Object Status -eq 'Running'
# Skriptblock-Form: $_ ist das aktuelle Objekt, nötig für zusammengesetzte BedingungenGet-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“# Filtert alle Prozesse, die mehr als 100 MB Arbeitsspeicher verwendenGet-Process | Where-Object { $_.WorkingSet -gt 100MB }1.2 Beispiel: Filterung anhand eines Musters
Abschnitt betitelt „1.2 Beispiel: Filterung anhand eines Musters“# Filtert alle Prozesse, deren Namen mit "P" beginnenGet-Process | Where-Object { $_.Name -like "P*" }2. Sort-Object
Abschnitt betitelt „2. Sort-Object“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“# Sortiert Prozesse in absteigender Reihenfolge nach der CPU-AuslastungGet-Process | Sort-Object CPU -Descending2.2 Mehrfache Sortierung
Abschnitt betitelt „2.2 Mehrfache Sortierung“# Sortiert zunächst nach CPU und dann nach dem Namen des ProzessesGet-Process | Sort-Object CPU, Name3. Select-Object
Abschnitt betitelt „3. Select-Object“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.
3.1 Beispiel: Auswahl spezifischer Eigenschaften
Abschnitt betitelt „3.1 Beispiel: Auswahl spezifischer Eigenschaften“# Wählt nur die Eigenschaften Name, CPU und Id der Prozesse ausGet-Process | Select-Object Name, CPU, Id3.2 Beispiel: Begrenzen der Ausgabe
Abschnitt betitelt „3.2 Beispiel: Begrenzen der Ausgabe“# Gibt nur die ersten 5 Prozesse zurückGet-Process | Select-Object -First 54. Kombinierte Anwendung in einer Pipeline
Abschnitt betitelt „4. Kombinierte Anwendung in einer Pipeline“Die wahre Stärke dieser Cmdlets zeigt sich, wenn sie kombiniert werden, um komplexe Datenverarbeitungsaufgaben zu lösen:
# Filtert Prozesse mit mehr als 50 Sekunden CPU-Zeit, sortiert sie absteigend# und gibt die Top 5 mit den Eigenschaften Name, CPU und Id ausGet-Process | Where-Object { $_.CPU -gt 50 } | Sort-Object CPU -Descending | Select-Object -First 5 -Property Name, CPU, Id5. Weitere Pipeline-Helfer
Abschnitt betitelt „5. Weitere Pipeline-Helfer“Zählen und Summieren: Measure-Object
Abschnitt betitelt „Zählen und Summieren: Measure-Object“Get-Service | Measure-Object # AnzahlGet-ChildItem C:\Kurs\Daten -File | Measure-Object -Property Length -SumGruppieren: Group-Object
Abschnitt betitelt „Gruppieren: Group-Object“Get-Service | Group-Object Status | Select-Object Name, CountBerechnete Eigenschaften mit Select-Object
Abschnitt betitelt „Berechnete Eigenschaften mit Select-Object“Mit einer Hashtable legst du eine neue Spalte an: Name ist der Spaltenname, Expression rechnet den Wert aus ($_ ist das aktuelle Objekt).
Get-Process | Select-Object Name, @{ Name = 'SpeicherMB'; Expression = { [math]::Round($_.WorkingSet / 1MB, 1) } } -First 5Datum und Zeit
Abschnitt betitelt „Datum und Zeit“Get-Date # jetzt(Get-Date).AddDays(-7) # vor sieben TagenGet-ChildItem C:\Kurs\Daten\Logs | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }6. Best Practices
Abschnitt betitelt „6. Best Practices“-
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*stattGet-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.
7. Zusammenfassung
Abschnitt betitelt „7. Zusammenfassung“-
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.