In Windows PowerShell werden häufig mehr Objekte generiert und an eine Pipeline übergeben als gewünscht. Zwar können Sie die Eigenschaften von Objekten, die angezeigt werden sollen, mit den Format-Cmdlets angeben, doch werden dadurch keine Objekte aus der Anzeige entfernt. Sie können Objekte vor dem Ende einer Pipeline filtern, sodass sich Aktionen nur auf eine Teilmenge der ursprünglich generierten Objekte auswirken.

Windows PowerShell enthält das Cmdlet Where-Object, mit dem Sie alle Objekte in der Pipeline testen und nur dann an die Pipeline übergeben können, wenn ein bestimmtes Testkriterium erfüllt ist. Objekte, die diesem Kriterium nicht genügen, werden aus der Pipeline entfernt. Die Testbedingung wird als Wert des FilterScript -Parameters von Where-Object angegeben.

Ausführen einfacher Tests mit Where-Object

Der Wert von FilterScript ist ein Skriptblock, d. h. ein in geschweifte Klammern {} eingeschlossener Block mit einem oder mehreren Windows PowerShell-Befehlen, der "True" oder "False" ergibt. Skriptblöcke können sehr einfach aufgebaut sein. Um einen Skriptblock zu erstellen, müssen Sie jedoch mit Vergleichsoperatoren, einem weiteren Konzept von Windows PowerShell vertraut sein. Mit einem Vergleichsoperator werden die Elemente auf beiden Seiten des Operators verglichen. Vergleichsoperatoren bestehen aus einem "-"-Zeichen, gefolgt von einem Namen. Einfache Vergleichsoperatoren können nahezu für alle Projekte verwendet werden. Erweiterte Vergleichsoperatoren funktionieren möglicherweise nur in Text oder Arrays.

Hinweis:

Bei der Arbeit mit Text wird von Windows PowerShell-Vergleichsoperatoren die Groß- und Kleinschreibung standardmäßig nicht berücksichtigt.

Mit Rücksicht auf Analysevorgänge werden die Symbole <,> und = nicht als Vergleichsoperatoren verwendet. Vergleichsoperatoren setzen sich stattdessen aus Buchstaben zusammen. In der folgenden Tabelle finden Sie eine Übersicht der grundlegenden Vergleichsoperatoren:

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 (Vergleich mit Platzhaltern für Text)

"datei.doc" -like "d*.do?"

-notlike

Entspricht nicht (Vergleich mit Platzhaltern für Text)

"datei.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 wird die spezielle Variable "$_" als Verweis auf das aktuelle Objekt in der Pipeline verwendet. Nachfolgend finden Sie ein Beispiel dafür. Wenn Sie aus einer Liste von Nummern nur diejenigen zurückgeben möchten, deren Wert kleiner als 3 ist, können Sie die Nummern mit Where-Object durch folgende Eingabe filtern:

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

Filtern auf Grundlage von Objekteigenschaften

Da "$_" auf das aktuelle Pipelineobjekt verweist, kann zum Testen auf die Eigenschaften zugegriffen werden.

Als Beispiel wird hier die Win32_SystemDriver-Klasse in WMI verwendet. Möglicherweise verfügt ein bestimmtes System über Hunderte von Systemtreibern. Sie interessieren sich jedoch nur für eine Teilmenge dieser Systemtreiber, etwa für die, die gerade ausgeführt werden. Wenn Sie die Elemente von Win32_SystemDriver (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property) mit Get-Member anzeigen, wird als entsprechende Eigenschaft "State" angezeigt. Diese weist, wenn der Treiber ausgeführt wird, den Wert "Running" auf. Sie können die Systemtreiber nach aktiven Treibern filtern, indem Sie Folgendes eingeben:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}

Die erzeugte Liste ist immer noch sehr lang. Sie können die Liste weiter filtern, um nur die Treiber auszuwählen, die automatisch gestartet werden, indem Sie zusätzlich den StartMode-Wert testen:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.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

So erhalten Sie zahlreiche Informationen, die nicht mehr benötigt werden, da bereits bekannt ist, dass die Treiber ausgeführt werden. An diesem Punkt werden eigentlich nur der Name und der Anzeigename benötigt. Diese beiden Eigenschaften werden durch folgenden Befehl eingeschlossen, mit dem eine deutlich übersichtlichere Ausgabe erzeugt wird:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName

Name                                    DisplayName
----                                    -----------
AsyncMac                                RAS Asynchronous Media Driver
Fdc                                     Floppy Disk Controller Driver
Flpydisk                                Floppy Disk Driver
Gpc                                     Generic Packet Classifier
IpNat                                   IP Network Address Translator
mouhid                                  Mouse HID Driver
MRxDAV                                  WebDav Client Redirector
mssmbios                                Microsoft System Management BIOS Driver

Der oben stehende Befehl enthält zwei Where-Object-Elemente. Diese können jedoch, wie nachfolgend dargestellt, mit dem logischen -and-Operator in einem Where-Object-Element zusammengefasst werden.

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

In der folgenden Tabelle finden Sie eine Übersicht der logischen Standardoperatoren:

Logischer Operator Bedeutung Beispiel (gibt "True" zurück)

-and

Logisches UND; True, wenn beide Seiten True ergeben

(1 -eq 1) -and (2 -eq 2)

-or

Logisches ODER; True, wenn eine Seite True ergibt

(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)




Inhaltsverzeichnis