Entfernen von Objekten aus der Pipeline

In PowerShell geschieht es häufig, dass Sie mehr Objekte als gewünscht generieren und an eine Pipeline übergeben. Mithilfe der Format-*-Cmdlets können Sie die anzuzeigenden Eigenschaften bestimmter Objekte angeben, es ist aber auf diese Weise nicht möglich, ganze Objekte aus der Anzeige zu entfernen. Sie können die Objekte vor dem Ende einer Pipeline filtern, um nur für eine Teilmenge der ursprünglich generierten Objekte bestimmte Aktionen auszuführen.

PowerShell umfasst ein Where-Object-Cmdlet, mit dem Sie jedes Objekt in der Pipeline testen können, um es nur dann an die Pipeline zu übergeben, wenn es eine bestimmte Testbedingung erfüllt. Objekte, die den Test nicht bestehen, werden aus der Pipeline entfernt. Sie geben die Testbedingung als Wert des Parameters FilterScript an.

Ausführen einfacher Tests mit „Where-Object“

Der Wert von FilterScript ist ein Skriptblock – d. h. mindestens ein in geschweiften Klammern eingeschlossener PowerShell-Befehl ({}) –, der als TRUE oder FALSE ausgewertet wird. Diese Skriptblöcke können einfach sein, aber ihre Erstellung erfordert Kenntnisse eines anderen PowerShell-Konzepts: Vergleichsoperatoren. Mit einem Vergleichsoperator werden die Elemente auf den beiden Seiten des Operators verglichen. Vergleichsoperatoren beginnen mit einem Minuszeichen (-), gefolgt von einem Namen. Die grundlegenden Vergleichsoperatoren können für nahezu jede Art von Objekt verwendet werden. Die erweiterten Vergleichsoperatoren können möglicherweise nur mit Text oder Arrays verwendet werden.

Hinweis

Bei PowerShell-Vergleichsoperatoren wird die Groß-/Kleinschreibung standardmäßig nicht beachtet.

Aus Analysegründen werden Symbole wie <, > und = nicht als Vergleichsoperatoren verwendet. Stattdessen bestehen Vergleichsoperatoren aus Buchstaben. In der folgenden Tabelle sind die grundlegenden Vergleichsoperatoren aufgeführt.

Vergleichsoperator Bedeutung Beispiel (gibt „true“ zurück)
-eq Ist gleich 1 -eq 1
-ne Ist ungleich 1 -ne 2
-lt Ist kleiner als 1 -lt 2
-le Ist kleiner als oder gleich 1 -le 2
-gt Ist größer als 2 -gt 1
-ge Ist größer als oder gleich 2 -ge 1
-like Entspricht (Platzhaltervergleich für Text) "file.doc" -like "f*.do?"
-notlike Ist ungleich (Platzhaltervergleich für Text) "file.doc" -notlike "p*.doc"
-contains Enthält 1,2,3 -contains 1
-notcontains Enthält nicht 1,2,3 -notcontains 4

In Where-Object-Skriptblöcken dient die spezielle Variable $_ zum Verweisen auf das aktuelle Objekt in der Pipeline. Es folgt ein Beispiel für die Funktionsweise. Wenn Sie über eine Liste mit Zahlen verfügen und nur diejenigen zurückgegeben möchten, die kleiner als 3 sind, können Sie die Zahlen mit Where-Object folgendermaßen filtern:

1,2,3,4 | Where-Object {$_ -lt 3}
1
2

Filtern basierend auf Objekteigenschaften

Da $_ auf das aktuelle Pipelineobjekt verweist, können wir für unsere Tests auf seine Eigenschaften zugreifen.

Als Beispiel können wir uns die Klasse Win32_SystemDriver in WMI anschauen. Möglicherweise gibt es in einem bestimmten System Hunderte von Systemtreibern, Sie sind aber vielleicht nur an bestimmten Systemtreibern interessiert, z. B. an den Treibern, die gerade ausgeführt werden. Für die Win32_SystemDriver-Klasse lautet die relevante Eigenschaft State. Sie können die Systemtreiber so filtern, dass nur die ausgeführten Treiber ausgewählt werden. Geben Sie dazu Folgendes ein:

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq 'Running'}

Dies erzeugt immer noch eine lange Liste. Vielleicht möchten Sie die Liste weiter filtern, um nur die Treiber auszuwählen, die automatisch gestartet werden. Hierzu testen Sie zusätzlich den StartMode-Wert:

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media Driver
Name        : AsyncMac
State       : Running
Status      : OK
Started     : True

DisplayName : Audio Stub Driver
Name        : audstub
State       : Running
Status      : OK
Started     : True
...

Dadurch erhalten Sie eine Vielzahl von Informationen, die Sie nicht mehr benötigen, da bekannt ist, dass die Treiber ausgeführt werden. In der Tat sind die einzigen Informationen, die Sie an dieser Stelle wahrscheinlich benötigen, der Name und der Anzeigename. Der folgende Befehl enthält nur diese zwei Eigenschaften, wodurch eine wesentlich vereinfachte Ausgabe erzeugt wird:

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Manual"} |
    Format-Table -Property Name,DisplayName
Name              DisplayName
----              -----------
AsyncMac               RAS Asynchronous Media Driver
bindflt                Windows Bind Filter Driver
bowser                 Browser
CompositeBus           Composite Bus Enumerator Driver
condrv                 Console Driver
HdAudAddService        Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus               Microsoft UAA Bus Driver for High Definition Audio
HidUsb                 Microsoft HID Class Driver
HTTP                   HTTP Service
igfx                   igfx
IntcDAud               Intel(R) Display Audio
intelppm               Intel Processor Driver
...

Der Befehl oben umfasst zwei Where-Object-Elemente, die aber mithilfe des logischen Operators -and wie folgt in einem einzigen Where-Object-Element ausgedrückt werden können:

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} |
    Format-Table -Property Name,DisplayName

In der folgenden Tabelle sind die standardmäßigen logischen Operatoren aufgeführt.

Logischer Operator Bedeutung Beispiel (gibt „true“ zurück)
-and Logisches „Und“; „true“, wenn beide Seiten zutreffen (1 -eq 1) -and (2 -eq 2)
-or Logisches „Oder“; „true“, wenn eine der beiden Seiten zutrifft (1 -eq 1) -or (1 -eq 2)
-not Logisches „Nicht“; kehrt „true“ und „false“ um -not (1 -eq 2)
! Logisches „Nicht“; kehrt „true“ und „false“ um !(1 -eq 2)