HOWTO · PowerShell
Wie man den Where-Object-Befehl in PowerShell verwendet
Erfahren Sie, wie `Where-Object` Pipelineobjekte mithilfe von Skriptblöcken, Eigenschaftsbedingungen, dem Alias `Where` und kombinierten Bedingungen filtert.
Auf dieser Seite
Verwenden Sie Where-Object, um in einer PowerShell-Pipeline nur die Objekte zu behalten, die eine Bedingung erfüllen. Eine Bedingung kann das aktuelle Objekt in einem Skriptblock prüfen oder für gängige Vergleiche die vereinfachte Eigenschaftssyntax des Cmdlets verwenden. Die folgenden Beispiele nutzen kleine, feste Sammlungen. So können Sie die Filterbedingungen anpassen, ohne auf Dateien oder laufende Prozesse auf Ihrem Computer angewiesen zu sein.
Das Where-Object-Cmdlet in PowerShell
Befehle in PowerShell leiten Objekte häufig über eine Pipeline weiter. Where-Object wertet seine Bedingung für jedes eingehende Objekt einzeln aus und gibt ein Objekt nur dann aus, wenn die Bedingung wahr ist. Innerhalb eines Skriptblocks verweist $_ auf das gerade geprüfte Objekt. Das Cmdlet ist nützlich, wenn eine Sammlung mehr Elemente enthält, als der nächste Befehl benötigt.
Das folgende Beispiel behält die beiden Datensätze mit dem Status Ready bei und gibt ihre Namen aus. Dieses Grundmuster können Sie an die Eigenschaften Ihrer eigenen Objekte anpassen:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
$tasks = @(
[pscustomobject]@{ Name = 'Build'; Status = 'Ready' }
[pscustomobject]@{ Name = 'Test'; Status = 'Waiting' }
[pscustomobject]@{ Name = 'Package'; Status = 'Ready' }
)
$tasks | Where-Object { $_.Status -eq 'Ready' } | ForEach-Object { $_.Name }
Filterbedingungen mit Skriptblöcken in PowerShell erstellen
Ein Skriptblock ist Code in geschweiften Klammern. Mit Where-Object dient er als Prädikat: Der Ausdruck wird für jedes Pipeline-Objekt ausgewertet, und Objekte mit einem wahren Ergebnis werden weitergegeben. Sie können den Skriptblock mit dem Parameter -FilterScript benennen oder als Positionsparameter übergeben:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
$services = @(
[pscustomobject]@{ Name = 'Archive'; StartType = 'Automatic' }
[pscustomobject]@{ Name = 'Indexer'; StartType = 'Manual' }
)
$services | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
Die Positionsform verwendet dieselbe Bedingung mit weniger Syntax: $services | Where-Object { $_.StartType -eq 'Automatic' }. Beide Formen werten jedes Objekt aus, sobald es in der Pipeline eintrifft. Verwenden Sie die benannte Form, wenn die explizite Angabe der Parameterrolle die Lesbarkeit verbessert. Ein Skriptblock eignet sich weiterhin für Logik mit mehreren Eigenschaften oder Operatoren.
Mit Where-Object Objekte in PowerShell filtern
Ein Eigenschaftsprädikat funktioniert mit allen Pipeline-Objekten, die die geprüfte Eigenschaft bereitstellen. So können Sie beispielsweise eine feste Sammlung dateiähnlicher Datensätze nach Dateiendung filtern:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
$files = @(
[pscustomobject]@{ Name = 'notes.csv'; Extension = '.csv' }
[pscustomobject]@{ Name = 'readme.txt'; Extension = '.txt' }
[pscustomobject]@{ Name = 'sales.csv'; Extension = '.csv' }
)
$files | Where-Object { $_.Extension -eq '.csv' }
Für tatsächliche Verzeichnisinhalte liefert Get-ChildItem Dateisystemobjekte. Nachdem Sie die gewünschte Verzeichnisliste $items zugewiesen haben, können Sie sie mit einem ähnlichen Prädikat filtern: $items | Where-Object { $_.Extension -eq '.csv' }. Welche Elemente übereinstimmen, hängt vom Inhalt des Verzeichnisses ab. Where ist ein Alias für Where-Object; in der entsprechenden Skriptblockform können Sie daher stattdessen Where verwenden.
Filterbedingungen mit Parametern in PowerShell erstellen
Für gängige Vergleiche gibt die vereinfachte Syntax direkt nach Where-Object eine Eigenschaft, einen Vergleichsparameter und einen Wert an. Zum Beispiel filtert $tasks | Where-Object -Property Status -EQ 'Ready' nach der Eigenschaft Status. Dabei sind -Property und -EQ Parameter von Where-Object. Parameternamen unterscheiden nicht zwischen Groß- und Kleinschreibung; -eq bezeichnet in dieser Syntax also denselben Vergleichsparameter. Innerhalb eines Skriptblocks ist -eq dagegen der Vergleichsoperator, der in Ausdrücken wie $_.Status -eq 'Ready' verwendet wird.
Diese Form ist knapp, wenn Sie eine einzelne Eigenschaft vergleichen. Verwenden Sie einen Skriptblock, wenn eine Bedingung mehr Kontrolle erfordert, etwa beim Vergleichen zweier Eigenschaften oder beim Kombinieren von Filterbedingungen. Beide Varianten filtern die eingehenden Objekte, statt sie zu verändern.
Mehrere Bedingungen kombinieren
Kombinieren Sie Bedingungen in einem Skriptblock mit -and, wenn alle Bedingungen wahr sein müssen, oder mit -or, wenn eine der Bedingungen ausreicht. Klammern gruppieren Vergleiche und machen die beabsichtigte Logik leichter erkennbar; eine besondere Subausdruckssyntax ist dafür nicht erforderlich.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
$tasks = @(
[pscustomobject]@{ Name = 'Build'; Status = 'Ready'; Priority = 1 }
[pscustomobject]@{ Name = 'Test'; Status = 'Waiting'; Priority = 1 }
[pscustomobject]@{ Name = 'Package'; Status = 'Ready'; Priority = 3 }
)
$tasks | Where-Object { ($_.Status -eq 'Ready') -and ($_.Priority -le 2) }
$tasks | Where-Object { ($_.Name -eq 'Test') -or ($_.Priority -ge 3) }
Die erste Bedingung behält nur Datensätze bei, die sowohl bereit als auch von hoher Priorität sind (Priorität 2 oder niedriger). Die zweite behält Datensätze mit dem Namen Test oder einer Priorität von 3 oder höher bei. Wählen Sie -and oder -or danach aus, ob für Ihre Filteraufgabe alle Kriterien oder nur eines davon erfüllt sein müssen.