從管線移除物件

在 PowerShell 中,您通常會產生更多物件並傳遞至管線,而不是您想要的。 您可以使用 Cmdlet 指定要顯示 Format-* 之特定物件的屬性,但這無助於從顯示器中移除整個對象的問題。 您可能想要在管線結尾之前篩選物件,以便只對最初產生的物件子集執行動作。

PowerShell 包含 Cmdlet Where-Object ,可讓您測試管線中的每個物件,而且只有在符合特定測試條件時,才會沿著管線傳遞它。 未通過測試的物件會從管線中移除。 您會提供測試條件做為 FilterScript 參數的值

使用 Where-Object 執行簡單的測試

FilterScript 的值是腳本區塊 -一或多個以大括弧 ({}) 括住的 PowerShell 命令,評估為 true 或 false。 這些腳本區塊可能很簡單,但建立它們需要瞭解另一個PowerShell概念、比較運算符。 比較運算子會比較出現在其每一端的專案。 比較運算符以連字元字元 (-) 開頭,後面接著名稱。 基本比較運算子幾乎適用於任何類型的物件。 更進階的比較運算符只能在文字或陣列上運作。

注意

根據預設,PowerShell 比較運算子不區分大小寫。

由於剖析考慮,和 等<>=符號不會當做比較運算符使用。 相反地,比較運算符是由字母所組成。 下表列出基本比較運算符。

比較運算子 意義 範例 (傳回 true)
-eq 等於 1 -eq 1
-ne 不等於 1 -ne 2
-lt 小於 1 -lt 2
-le 小於或等於 1 -le 2
-gt 大於 2 -gt 1
-ge 大於或等於 2 -ge 1
-喜歡 就像 (文字的通配符比較) “file.doc” -like “f*.do?”
-notlike 不喜歡 (文字的通配符比較) “file.doc” -notlike “p*.doc”
-包含 包含 1,2,3 -contains 1
-notcontains 不包含 1,2,3 -notcontains 4

Where-Object 腳本區塊會使用特殊變數 $_ 來參考管線中的目前物件。 以下是其運作方式的範例。 如果您有數位清單,而且只想要傳回小於 3 的數位,您可以使用 Where-Object 輸入來篩選數位:

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

根據物件屬性進行篩選

由於 $_ 參考目前的管線物件,因此我們可以存取其測試的屬性。

例如,我們可以查看 WMI 中的 Win32_SystemDriver 類別。 特定系統上可能會有數百個系統驅動程式,但您可能只對一組特定的系統驅動程式感興趣,例如正在執行的系統驅動程式。 對於Win32_SystemDriver類別,相關屬性為 State。 您可以輸入下列命令來篩選系統驅動程式,只選取執行中的驅動程式:

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

這仍然會產生長清單。 您可能也想要篩選,只選取設定為自動啟動的 驅動程式,方法是測試 StartMode 值:

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

這給了我們許多不再需要的信息,因為我們知道驅動程式正在執行。 事實上,我們目前可能需要的唯一資訊是名稱和顯示名稱。 下列命令只包含這兩個屬性,因而產生更簡單的輸出:

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

上述命令中有兩 Where-Object 個元素,但是可以使用邏輯運算符在單 Where-Object 一元素 -and 中表示,如下所示:

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

下表列出標準邏輯運算符。

邏輯運算子 意義 範例 (傳回 true)
-and 邏輯和;如果雙方都成立,則為 true (1 -eq 1) -and (2 -eq 2)
-or 邏輯或;如果任一端為 true,則為 true (1 -eq 1) -or (1 -eq 2)
-not 邏輯不;反轉 true 和 false -not (1 -eq 2)
! 邏輯不;反轉 true 和 false !(1 -eq 2)