• 12/23/2019
  • 4 Minuten zu lesen
    • j
    • s
    • m

In PowerShell, werden oft mehr Objekte generiert und an eine Pipeline weitergegeben, als Sie möchten. Sie können die Eigenschaften bestimmter Objekte, die angezeigt werden sollen, mit den Cmdlets Format-* angeben, aber dies hilft nicht bei dem Problem, ganze Objekte aus der Anzeige zu entfernen. Möglicherweise möchten Sie Objekte vor dem Ende einer Pipeline filtern, damit Sie Aktionen nur für eine Teilmenge der ursprünglich generierten Objekte durchführen können.

PowerShell enthält ein Cmdlet Where-Object, mit dem Sie jedes Objekt in der Pipeline testen und nur dann an die Pipeline weiterleiten können, wenn es eine bestimmte Testbedingung erfüllt. Objekte, die den Test nicht bestehen, werden aus der Pipeline entfernt. Sie geben die Testbedingung als Wert desFilterScript -Parameters an.

Durchführen einfacher Tests mit Where-Object

Der Wert von FilterScript ist ein Skriptblock – ein oder mehrere PowerShell-Befehle, die von geschweiften Klammern ({}) umgeben sind – der als wahr oder falsch ausgewertet wird. Diese Skriptblöcke können sehr einfach sein, aber ihre Erstellung erfordert Kenntnisse über ein anderes PowerShell-Konzept, nämlich Vergleichsoperatoren. Ein Vergleichsoperator vergleicht die Elemente, die auf beiden Seiten des Operators stehen. Vergleichsoperatoren beginnen mit einem Bindestrichzeichen (-) und werden von einem Namen gefolgt. Grundlegende Vergleichsoperatoren funktionieren mit fast allen Arten von Objekten. Die fortgeschritteneren Vergleichsoperatoren funktionieren möglicherweise nur mit Text oder Arrays.

Hinweis

Standardmäßig wird bei der Arbeit mit Text bei PowerShell-Vergleichsoperatoren nicht zwischen Groß- und Kleinschreibung unterschieden.

Aus Gründen des Parsings werden Symbole wie <,> und = nicht als Vergleichsoperatoren verwendet. Stattdessen werden die Vergleichsoperatoren aus Buchstaben zusammengesetzt. Die grundlegenden Vergleichsoperatoren sind in der folgenden Tabelle aufgeführt.

Vergleichsoperator Bedeutung Beispiel (gibt wahr zurück)
-eq ist gleich 1 -eq 1
-ne ist nicht gleich 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 oder gleich 2 -ge 1
-like Ist wie (Platzhaltervergleich für Text) „file.doc“ -like „f*.do?“
-notlike Is not like (wildcard comparison for text) „file.doc“ -notlike „p*.doc“
-enthält enthält 1,2,3 -enthält 1
-nicht-enthält Enthält nicht 1,2,3 -notcontains 4

Where-Object Skriptblöcke verwenden die spezielle Variable $_, um auf das aktuelle Objekt in der Pipeline zu verweisen. Hier ein Beispiel dafür, wie es funktioniert. Wenn Sie eine Liste von Zahlen haben und nur diejenigen zurückgeben möchten, die kleiner als 3 sind, können Sie Where-Object verwenden, um die Zahlen zu filtern, indem Sie Folgendes eingeben:

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

Filtern auf der Grundlage von Objekteigenschaften

Da sich $_ auf das aktuelle Pipeline-Objekt bezieht, können wir für unsere Tests auf dessen Eigenschaften zugreifen.

Als Beispiel können wir uns die Klasse Win32_SystemDriver in WMI ansehen. Es kann Hunderte von Systemtreibern auf einem bestimmten System geben, aber Sie sind vielleicht nur an einer bestimmten Gruppe von Systemtreibern interessiert, z. B. an denjenigen, die gerade ausgeführt werden. Für die Klasse Win32_SystemDriver ist die Eigenschaft State relevant. Sie können die Systemtreiber filtern und nur die laufenden Treiber auswählen, indem Sie eingeben:

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

Das ergibt immer noch eine lange Liste. Sie können auch filtern, um nur die Treiber auszuwählen, die auf automatischen Start eingestellt sind, indem Sie den StartMode-Wert testen:

Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq "Running"} | Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media DriverName : AsyncMacState : RunningStatus : OKStarted : TrueDisplayName : Audio Stub DriverName : audstubState : RunningStatus : OKStarted : True...

Damit erhalten wir eine Menge Informationen, die wir nicht mehr benötigen, da wir wissen, dass die Treiber laufen.Tatsächlich sind die einzigen Informationen, die wir zu diesem Zeitpunkt wahrscheinlich brauchen, der Name und der Anzeigename. Der folgende Befehl enthält nur diese beiden Eigenschaften, was zu einer viel einfacheren Ausgabe führt:

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 Driverbindflt Windows Bind Filter Driverbowser BrowserCompositeBus Composite Bus Enumerator Drivercondrv Console DriverHdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio ServiceHDAudBus Microsoft UAA Bus Driver for High Definition AudioHidUsb Microsoft HID Class DriverHTTP HTTP Serviceigfx igfxIntcDAud Intel(R) Display Audiointelppm Intel Processor Driver...

Der obige Befehl enthält zwei Where-Object-Elemente, die jedoch durch Verwendung des logischen Operators -and in einem einzigenWhere-Object-Element ausgedrückt werden können, etwa so:

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

Die standardmäßigen logischen Operatoren sind in der folgenden Tabelle aufgeführt.

Logisches und; wahr, wenn beide Seiten wahr sind

Logischer Operator Bedeutung Beispiel (gibt wahr zurück)
und (1 -eq 1) -und (2 -eq 2)
-oder Logisches oder; wahr, wenn eine der beiden Seiten wahr ist (1 -eq 1) -oder (1 -eq 2)
-nicht Logisch nicht; kehrt wahr und falsch um -nicht (1 -eq 2)
! Logisch nicht; kehrt wahr und falsch um !(1 -eq 2)

admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

lg