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