Wenn Sie mit PowerShell-Eigenschaftswerten in einer Sammlung von Objekten arbeiten, benötigen Sie manchmal eine Möglichkeit, alle Dinge auszufiltern, die Sie nicht benötigen. Zu wissen, wie man das PowerShell-Where-Object
-Cmdlet verwendet, ist eine wichtige Fähigkeit, die Sie in Ihrem PowerShell-Werkzeugkasten haben sollten.
Das Where-Object
-Cmdlet ist eine praktische Möglichkeit, Objekte zu filtern. In diesem Tutorial lernen Sie verschiedene Möglichkeiten kennen, ein Where-Object
-Kommando zu erstellen, die verfügbaren Parameter, die Syntax sowie wie Sie mehrere Bedingungen wie ein Profi verwenden!
Voraussetzungen
Es gibt nur eine Voraussetzung für diesen Artikel. Sie sollten mit einigen grundlegenden PowerShell-Befehlen und der Syntax vertraut sein.
Alle Beispiele in diesem Artikel basieren auf der aktuellen stabilen Version von PowerShell (7.1.0 zum Zeitpunkt des Schreibens). Aber solange Sie Windows PowerShell 4.0 und höher haben, funktionieren die Befehle genauso.
Verständnis, wie das PowerShell Where-Object funktioniert
Das einzige Ziel des PowerShell-Where-Object
-Cmdlets besteht darin, die Ausgabe eines Befehls zu filtern, um nur die Informationen anzuzeigen, die Sie sehen möchten.
Kurz gesagt, das Where-Object
-Cmdlet ist ein Filter; das ist alles. Es ermöglicht Ihnen, eine Bedingung zu konstruieren, die True oder False zurückgibt. Abhängig vom Ergebnis dieser Bedingung gibt das Cmdlet dann entweder die Ausgabe zurück oder nicht.
Sie können diese Bedingung auf eine von zwei Arten erstellen; auf die „alte“ Art mit Scriptblocks und auf die „neue“ Art mit Parametern oder Vergleichsaussagen.
Erstellen von Filterbedingungen mit Scriptblocks
Scriptblocks sind eine Schlüsselkomponente in PowerShell. Scriptblocks werden an Hunderten von Stellen in der Sprache verwendet. Eine Scriptblock ist eine anonyme Funktion. Es ist eine Möglichkeit, Code zu segmentieren und ihn an verschiedenen Stellen auszuführen. Sie können einen Filter für Where-Object
über eine Scriptblock erstellen.
Um eine Scriptblock als Filter zu verwenden, verwenden Sie den Parameter FilterScript
. Dieser Parameter ermöglicht es Ihnen, eine Scriptblock zu erstellen und an den Parameter FilterScript
zu übergeben, der dann ausgeführt wird.
Wenn die Scriptblock einen Wert zurückgibt, der nicht gleich False oder einer Nullvariable ist, wird er als True betrachtet. Andernfalls wird er als False betrachtet.
Zum Beispiel, sagen wir, Sie müssen alle Windows-Dienste finden, die derzeit einen Starttyp von Automatisch haben. Sie würden zunächst alle aktuellen Dienste mit Get-Service
abrufen. Get-Service
gibt dann viele verschiedene Dienstobjekte mit verschiedenen Eigenschaften zurück.
Mit der PowerShell-Pipeline könnten Sie dann diese Objekte an das Where-Object
-Cmdlet weiterleiten und den FilterScript
-Parameter verwenden. Da der FilterScript
-Parameter einen Skriptblock akzeptiert, könnten Sie eine Bedingung erstellen, um zu überprüfen, ob die StartType
-Eigenschaft jedes Objekts gleich Automatic ist, wie unten gezeigt.
Nachdem Sie den Filter-Skriptblock haben, würden Sie diesen Skriptblock dann dem FilterScript
-Parameter übergeben. Where-Object
würde dann diesen Skriptblock für jedes Objekt ausführen, das über die Pipeline kommt, und jede StartType
-Eigenschaft auswerten. Wenn die Eigenschaft gleich Automatic ist, würde Where-Object
das Objekt durchlassen. Wenn nicht, würde das Objekt verworfen werden.
Sie können unten ein einfaches Beispiel für diese Methodik sehen.

Viele Leute verwenden positionale Parameter mit dem
Where-Object
-Cmdlet und geben den Namen desFilterScript
-Parameters nicht an. Stattdessen geben sie einfach den Skriptblock allein an, wie z.B.Where-Object {$_.StartType -eq 'Automatic'}
.
Obwohl diese Art von Konstruktion für dieses bestimmte Szenario funktioniert. Das Konzept eines Skriptblocks mit den geschweiften Klammern oder sogar der Pipeline-Variable $_
macht den Code weniger lesbar und schwieriger für weniger erfahrene PowerShell-Benutzer. Dieses Lesbarkeitsproblem hat das PowerShell-Team dazu veranlasst, Parameter oder Vergleichsaussagen einzuführen.
Vergleichsaussagen
In Windows PowerShell 3.0 eingeführt, haben Vergleichsanweisungen einen natürlicheren Aufbau. Mit demselben Szenario wie im vorherigen Beispiel verwenden wir die Vergleichsanweisung, um alle Windows-Dienste mit einem automatischen Starttyp zu finden:
Beachten Sie oben, dass anstelle eines Skriptblocks der Befehl den Objekteigenschaft als Parameterwert für den Parameter „Property“ angibt. Der Operator „eq“ ist nun ebenfalls ein Parameter, der es Ihnen ermöglicht, den Wert „Automatisch“ an ihn zu übergeben.
Die Verwendung von Parametern auf diese Weise beseitigt nun vollständig die Notwendigkeit eines Skriptblocks.
A scriptblock is a better choice when defining more complex filtering conditions. The
Property
parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!
In dem nächsten Abschnitt erfahren Sie mehr über die verfügbaren Vergleichsoperatoren, die mit „Where-Object“ verwendet werden können, um alles zu filtern.
Grundlagen des Filterns
Mit Parametern filtert „Where-Object“ Sammlungen von Objekten mithilfe von gängigen Vergleichsoperatoren. Tauchen wir in einige Beispiele ein, wie sie funktionieren.
Kontainmentsoperatoren
Kontainmentsoperatoren sind nützlich, wenn Sie mit Sammlungen arbeiten. Sie ermöglichen es Ihnen, eine Bedingung festzulegen, ob eine Sammlung ein Element enthält oder nicht.
Als Beispiel nehmen wir an, dass Sie nach einem bestimmten Eigenschaftswert in einer Sammlung filtern möchten. Sie könnten Kontainmentsoperatoren verwenden.
In PowerShell finden Sie einige verschiedene Kontainmentsoperatoren:
-contains
/-ccontains
– Filtern Sie eine Sammlung, die einen Eigenschaftswert enthält.-notcontains
/-cnotcontains
– Filtern einer Sammlung, die keinen Eigenschaftswert enthält.-in
/-cin
– Wert ist in einer Sammlung enthalten, gibt den Eigenschaftswert zurück, wenn eine Übereinstimmung gefunden wird.-notin
/-cnotin
– Wert ist nicht in einer Sammlung enthalten,null
/$false
, wenn kein Eigenschaftswert vorhanden ist.
Für die Groß- und Kleinschreibung verwenden Sie Kontain-Operatoren, die mit -c[Operator]
beginnen
Verwandt: PowerShell-Vergleichsoperatoren verstehen anhand von Beispielen
Angenommen, Sie möchten den Status des BITS-Windowsdienstes überprüfen. Dies können Sie mithilfe des contains
-Parameters (Operators) tun, indem Sie den Wert von BITS wie unten übergeben.
Und unten ist, was Sie erwarten würden zu sehen:

Denken Sie immer daran, links zu filtern! Das vorherige Beispiel entspricht dem Ausführen von
Get-Service -ServiceName 'BITS'
.
Vielleicht möchten Sie ausgefeilter vorgehen und alle Dienste finden, deren Status nicht Running ist und deren Starttyp in einem einzigen String (oder Array) namens Manuell ist. Mit einem Skriptblock unten verwendet der Befehl den FilterScript
-Parameter, um einen Skriptblock zu übergeben, der beide Bedingungen auswertet.
Verwandt: Zurück zu den Grundlagen: PowerShell-Objekte verstehen
Wenn Sie den oben genannten Befehl ausführen, sehen Sie nur Dienste, die angehalten sind und einen Starttyp von Manuell haben.

Die Filterung mit Enthaltungsoperatoren funktioniert gut mit Sammlungen, die viele Eigenschaftswerte enthalten. Angesichts der Anzahl der Eigenschaften, die Get-Service
zurückgibt, wird die Filterung durch all diese Eigenschaften erleichtert, wenn Sie Enthaltungs- und logische Operatoren kombinieren.
Vergleichsoperatoren
Ähnlich wie bei der Verwendung von Enthaltungsoperatoren mit Where-Object
können Sie auch Übereinstimmungsoperatoren verwenden. Übereinstimmungsoperatoren ermöglichen es Ihnen, Zeichenfolgen in Zeichenfolgen abzugleichen. Zum Beispiel gibt 'foofoo' -like '*foo*'
True zurück oder 'foofoo' -match 'foo'
gibt True zurück. Übereinstimmungsoperatoren gleichen Zeichenfolgen in Zeichenfolgen ab.
In PowerShell stehen Ihnen einige verschiedene Übereinstimmungsoperatoren zur Verfügung, die Sie in Where-Object
verwenden können.
-like
/-clike
– Zeichenfolge stimmt mit einem Platzhaltermuster überein.-notlike
/-cnotlike
– Zeichenfolge stimmt nicht mit einem Platzhaltermuster überein.-match
/-cmatch
– Zeichenfolge stimmt mit einem Regex-Muster überein.-notmatch
/-cnotmatch
– Zeichenfolge stimmt nicht mit einem Regex-Muster überein.
Für die Groß- und Kleinschreibung verwenden Sie Übereinstimmungsoperatoren, die mit
-c[Operator]
beginnen
Fast identisch in der Form zu den Begrenzungsoperatoren können Sie Übereinstimmungsoperatoren wie unten gezeigt verwenden. Das folgende Beispiel findet alle Dienste, die Windows im Wert der Anzeigename-Eigenschaft haben.

match
operator uses regular expressions to match on certain values.Verwandt: Erste Schritte mit PowerShell und Regex
Sie können auch den like
-Operator verwenden, um gängige Übereinstimmungstechniken zu nutzen, wie das Verwenden eines Platzhalters (*
), um jedes Zeichen oder vielleicht ein ?
zu entsprechen, um ein einzelnes Zeichen zu entsprechen.
Die Ergebnisse sind jetzt auf diejenigen Dienstnamen gefiltert, die ‚ Win ‚ als die ersten drei Zeichen haben:

Die Verwendung des Platzhalters bedeutet, dass Sie den vollständigen Namen des Dienstes nicht kennen müssen. Ein paar Buchstaben der Zeichenkette genügen. Diese Operatoren können auch mit logischen Operatoren kombiniert werden, um die Filterung noch weiter zu verbessern.
Gleichheitsoperatoren
Ähnlich wie bei der Verwendung von Begrenzungs- und Vergleichsoperatoren können Sie auch Gleichheitsoperatoren mit Where-Object
verwenden. Gleichheitsoperatoren sind nützlich, wenn Sie numerische Werte vergleichen müssen.
Zum Beispiel wäre 1 -eq 1
True, während 1 -gt 2
False wäre. PowerShell hat viele verschiedene Gleichheitsoperatoren, die Sie als Where-Object
-Parameter oder innerhalb von Bedingungsskriptblöcken verwenden können.
-eq
/-ceq
– Wert gleich dem angegebenen Wert.-ne
/-cne
– Wert ungleich dem angegebenen Wert.-gt
/-cgt
– Wert größer als der angegebene Wert.-ge
/-cge
– Wert größer oder gleich dem angegebenen Wert.-lt
/-clt
– Wert kleiner als der angegebene Wert.-le
/-cle
– Wert kleiner oder gleich dem angegebenen Wert.
Zum Beispiel möchten Sie möglicherweise alle laufenden Prozesse finden, die zwischen zwei und zehn Prozent Ihrer CPU belegen. Kein Problem mit den Get-Process
und Where-Object
PowerShell-Cmdlets.
Mit einem Skriptblock können Sie zwei Bedingungen mit dem and
-Operator kombinieren, der beide auswertet. Wenn beide True zurückgeben, gibt Where-Object
das Prozessobjekt zurück, das über die Pipeline übergeben wurde. Wenn mindestens eine der Bedingungen False zurückgibt, lässt Where-Object
das Objekt fallen.
Hier ist, was Sie erwarten würden:

Das Filtern mit den Where-Object
-Gleichheitsoperatoren hilft Ihnen beim Erstellen von Systemberichten oder beim Vergleichen von Werten.
Nächste Schritte
Nun, da Sie mehr darüber wissen, wie Sie das PowerShell Where-Object
-Cmdlet verwenden können, um alle Dinge zu filtern, was können Sie sonst noch tun? Versuchen Sie einige komplexere Filteraufgaben mit mehreren Bedingungen und Operatoren auf Sammlungen, um Eigenschaftswerte zu filtern und die Ausgabe nach Ihrem Geschmack zu formatieren.
Source:
https://adamtheautomator.com/powershell-where-object/