在 Windows PowerShell 中,通常會產生一些您不想要的物件並且傳遞至管線中。您可以使用 Format Cmdlet 指定特定物件所要顯示的屬性,但這樣做仍未解決從畫面上移除整個物件的問題。您可能想要在抵達管線結尾前就篩選物件,以便能夠只對最初產生物件的子集執行動作。

Windows PowerShell 提供 Where-Object Cmdlet 讓您測試管線中的每個物件,進而只沿管線傳遞符合特定測試條件的物件。沒有通過測試的物件都將從管線移除。測試條件要提供成 Where-Object FilterScript 參數的值。

使用 Where-Object 執行簡單測試

FilterScript 的值是「指令碼區塊」(Script Block),包含了放在大括號 {} 中的一或多個 Windows PowerShell 命令,且其結果評估為 true 或 false。這類指令碼區塊可能非常簡單,但在開始建立前必須先了解 Windows PowerShell 的另一種概念,也就是比較運算子。比較運算子會比較位於其兩側的項目。比較運算子以 '-' 字元開頭,後面接著名稱。基本的比較運算子幾乎可比較任何的物件種類。更進階的比較運算子或許只能比較文字或陣列。

附註:

預設情況下,Windows 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

-like

相似 (對文字進行萬用字元比較)

"file.doc" -like "f*.do?"

-notlike

不相似 (對文字進行萬用字元比較)

"file.doc" -notlike "p*.doc"

-contains

包含

1,2,3 -contains 1

-notcontains

不包含

1,2,3 -notcontains 4

Where-Object 指令碼區塊使用特殊變數 '$_' 代表目前位於管線中的物件。以下範例示範其運作情形。假設您有一份數字清單,而只想要傳回小於 3 的數字,即可使用 Where-Object 篩選數字,如下所示:

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

依據物件屬性進行篩選

由於 $_ 代表目前管線物件,您可以存取其屬性進行測試。

底下將以 WMI 的 Win32_SystemDriver 類別舉例說明。任何系統可能有數百種系統驅動程式,但您或許只想查看其中某一組,例如目前執行中的系統驅動程式。若您使用 Get-Member 檢視 Win32_SystemDriver 成員 (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property),會發現與這方面有關的屬性是 State,其值為 "Running" 即表示驅動程式正在執行中。您可以篩選系統驅動程式,輸入下列命令僅選取執行中的驅動程式:

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

產生的清單仍然很長。您也可以測試 StartMode 值,篩選出設定成自動啟動的驅動程式:

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

這顯然產生許多不必要的資訊,因為您早已知道這些驅動程式均為執行中。事實上,這時您所需要的資訊大概只有驅動程式的名稱及其顯示名稱。下列命令只納入這兩個屬性,因而產生更簡短的輸出:

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

上述命令中有兩個 Where-Object 元素,但您亦可使用 -and 邏輯運算子將兩者結合成單一 Where-Object 元素,像這樣:

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

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

邏輯運算子 意義 範例 (傳回 true)

-and

邏輯 and;兩側均為 true 即傳回 true

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

-or

邏輯 or;任一側為 true 即傳回 true

(1 -eq 1) -or (1 -eq 2)

-not

邏輯 not;反轉 true 和 false

-not (1 -eq 2)

!

邏輯 not;反轉 true 和 false

!(1 -eq 2)




目錄