Verwenden des Cmdlet \"Where-Object\"

Filtern von zurückgegebenen Daten

Mit dem Cmdlet Where-Object können Sie Daten filtern, die von anderen Cmdlets zurückgegeben wurden. Standardmäßig gibt beispielsweise das Cmdlet Get-Process Informationen über alle Prozesse aus, die derzeit auf einem Computer ausgeführt werden. Wir nehmen allerdings an, dass Sie nur an Prozessen mit mehr als 200 Handles interessiert sind. (Wir sind nicht ganz sicher, warum Sie an so was interessiert sein könnten, aber gut …) Um nur diese Teilmenge der Prozesse zu erhalten, rufen Sie Get-Process auf und übergeben die Ergebnisse an Where-Object:

Get-Process | Where-Object {$_.handles -gt 200}

Beachten Sie auf jeden Fall die Syntax. Die "Where"-Klausel ist in geschweiften Klammern eingeschlossen. Zusätzlich wird die Bezeichnung $_ verwendet, um das Standardobjekt darzustellen (also das Objekt, das über die Pipeline übergeben wird). Beachten Sie zu guter Letzt den Vergleichsoperator, der "Größer als" angibt: –gt im Gegensatz zu >. Windows PowerShell verwendet keine arithmetischen Standardvergleichsoperatoren, sondern beispielsweise folgende Operatoren:

  • -lt -- "Kleiner als"

  • -le -- "Kleiner als" oder "Gleich"

  • -gt -- "Größer als"

  • -ge -- "Größer als" oder "Gleich"

  • -eq -- "Gleich"

  • -ne -- "Ungleich"

  • -like – "Gleich"; verwendet Platzhalterzeichen für Musterübereinstimmung

Mit anderen Worten: Wenn wir nach Prozessen suchen, deren Anzahl an Handles größer oder gleich 200 ist, würden wir diesen Befehl verwenden:

Get-Process | Where-Object {$_.handles -ge 200}

Sie können auch die Parameter –and sowie –or verwenden, um noch speziellere Datasets zu erstellen. Nehmen wir beispielsweise an, Sie möchten alle Instanzen des Prozesses "svchost" zurückgeben, die mehr als 200 Handles verwenden. Sie müssen dazu nur diese beiden Kriterien in die "Where"-Klausel einfügen und sie durch –and trennen:

Get-Process | Where-Object {$_.handles -gt 200 -and $_.name -eq "svchost"}

Ähnlich ist es, wenn Sie eine Liste aller Prozesse wünschen, die mehr als 200 Handles verwenden oder die den Namen "svchost" enthalten. (Oder anders gesagt, alle Prozesse, die mehr als 200 Handles verwenden sowie alle Prozesse mit Namen "svchost", unabhängig von der Anzahl an Handles, die diese Prozesse verwenden). Verwenden Sie in diesem Fall den Parameter –or, um diese beiden Teile der "Where"-Klausel zu verbinden:

Get-Process | Where-Object {$_.handles -gt 200 -or $_.name -eq "svchost"}

Hier ist ein weiteres Beispiel, bei dem Ihnen (mit dem Cmdlet Get-ChildItem) nur die Dateien im Ordner C:\Scripts angezeigt werden, die größer als 100.000 Bytes sind:

Get-ChildItem c:\scripts | Where-Object {$_.length -gt 100000}

Und vergessen wir nicht den Operator –like. Der folgende Befehl gibt alle Dateien aus C:\Scripts zurück, die im Dateinamen die Zeichenfolge test enthalten. Beachten Sie die Verwendung von zwei Sternchen als Platzhalterzeichen:

Get-ChildItem c:\scripts | Where-Object {$_.name -like "*test*"}

Und das sind die Daten, die Sie in etwa erhalten könnten:

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---          5/6/2006  10:24 PM      34198 test.csv
-a---         5/19/2006   9:11 AM       5918 test.htm
-a---         5/19/2006   8:16 AM      34226 test.log
-a---         5/19/2006   1:20 PM         65 test.ps1
-a---         5/20/2006   9:52 AM        150 test.psc1
-a---         5/20/2006   9:52 AM        150 test.psc1e.psc1
-a---         5/19/2006   1:27 PM        565 test.txt
-a---         4/17/2006   6:41 PM      24064 test.txt.doc
-a---         5/19/2006   1:45 PM       1971 test.vbs
-a---         5/17/2006   1:41 PM       9248 test.xls
-a---         5/19/2006   1:20 PM     628234 Test.xml
-a---          4/6/2006  10:26 PM        205 test_NODUPL.txt

Aliase für "Where-Object"

  • where