Beherrschen von PowerShell Where-Object: Ein umfassender Leitfaden

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.

{$_.StartType -EQ 'Automatic'}

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.

Get-Service | Where-Object -FilterScript {$_.StartType -EQ 'Automatic'}
Script Block construct

Viele Leute verwenden positionale Parameter mit dem Where-Object-Cmdlet und geben den Namen des FilterScript-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:

Get-Service | Where-Object -Property StartType -EQ 'Automatic'

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.

Get-Service | Where-Object -Property Name -Contains 'BITS'

Und unten ist, was Sie erwarten würden zu sehen:

Where-Object equivalent to Get-Service -ServiceName ‘BITS’

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

Get-Service |
	Where-Object {($_.Status -notcontains 'Running') -and ($_.StartType -in 'Manual')}

Wenn Sie den oben genannten Befehl ausführen, sehen Sie nur Dienste, die angehalten sind und einen Starttyp von Manuell haben.

More advanced filtering of a collection of objects

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.

Get-Service | Where-Object { $_.DisplayName -match 'Windows'}
The 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.

Get-Service | Where-Object {($_.Name -like 'Win*')}

Die Ergebnisse sind jetzt auf diejenigen Dienstnamen gefiltert, die ‚ Win ‚ als die ersten drei Zeichen haben:

service names with ‘Win

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.

Get-Process | Where-Object {($_.CPU -gt 2.0) -and ($_.CPU -lt 10)}

Hier ist, was Sie erwarten würden:

Filtering with greater than and less than

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/