如何在 PowerShell 中使用 Where-Object 命令
-
PowerShell 中的
Where-Object
Cmdlet - 使用腳本區塊在 PowerShell 中創建過濾條件
-
使用
Where-Object
在 PowerShell 中過濾物件 - 使用參數在 PowerShell 中創建過濾條件
- 使用多個條件語句

當你在一個物件集合中使用 Windows PowerShell 屬性時,有時你需要一種方法來過濾出你所需的特定內容。因此,知道如何使用 Windows PowerShell 的 Where-Object
cmdlet 是你 Windows PowerShell 技能組中必備的重要技術。
Where-Object
cmdlet 是過濾物件的有價值的命令。在本篇文章中,我們將學習幾種構造 Where-Object
命令的方法、其語法以及使用多個條件語句的方法。
PowerShell 中的 Where-Object
Cmdlet
Windows PowerShell 的 Where-Object
cmdlet 唯一的目標是過濾命令的輸出並返回我們想要列印出來的特定信息。
總結來說,Where-Object
cmdlet 是一個過濾器。它允許我們構造一個返回 True
或 False
的條件。根據情況的結果,該 cmdlet 然後決定是否返回輸出。
你可以用兩種方式來構建該條件:腳本區塊和參數。
使用腳本區塊在 PowerShell 中創建過濾條件
腳本區塊是 Windows PowerShell 中的重要組件。它們被用於腳本語言的數百個地方。腳本區塊是一個匿名函數,將代碼分類並在各種地方執行它。
示例腳本區塊:
{$_.StartType -EQ 'Automatic'}
使用 Windows PowerShell 管道,你可以將這些物件通過管道傳遞到 Where-Object
cmdlet 並使用 FilterScript
參數。由於 FilterScript
參數接受腳本區塊,我們可以創建一個條件來檢查每個物件的屬性是否等於特定值,如以下示例所示。
示例代碼:
Get-Service | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
Where-Object
cmdlet 的位置參數,而不包括 FilterScript
參數名稱。相反,他們僅提供腳本區塊,如 Where-Object {$_.StartType -eq 'Automatic'}
,這樣可以更快速和更乾淨地編寫腳本。儘管這種語法在這個特定場景中有效,但使用大括號({}
)的腳本區塊概念使代碼的可讀性降低,對於不太有經驗的 Windows PowerShell 使用者來說更難理解。這種可讀性問題使 Windows PowerShell 團隊引入了參數。
使用 Where-Object
在 PowerShell 中過濾物件
Get-ChildItem
獲取指定位置的所有文件和文件夾的列表。假設你只想顯示目錄中的 .csv
文件。
以下示例顯示了如何使用 Where-Object
cmdlet 來過濾並選擇僅 .csv
文件。
Get-ChildItem | Where-Object { $_.extension -eq ".csv" }
在上述腳本中,Get-ChildItem
的輸出被通過管道傳遞至 Where-Object
cmdlet。Where-Object
過濾輸出,條件是文件擴展名為 .csv
。
輸出:
Directory: C:\Users\rhntm
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/11/2022 7:57 AM 122 books.csv
-a---- 3/8/2022 2:07 PM 780199 house_data.csv
-a---- 3/8/2022 10:38 PM 421 play_tennis.csv
你也可以使用 Where
作為 Where-Object
cmdlet 的別名。
以下是另一個範例,過濾 ProcessName
屬性值的進程列表。它僅顯示 ProcessName
為 spotify
的進程。
Get-Process | where { $_.ProcessName -in "spotify" }
輸出:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
550 31 55036 71256 2.81 1820 3 Spotify
294 21 12328 18144 0.06 13536 3 Spotify
476 64 96012 141208 20.61 13980 3 Spotify
你可以使用 -notin
運算符來選擇不在物件集合中的值。
例如,以下示例列印所有 ProcessName
不是 spotify
的進程。
Get-Process | where { $_.ProcessName -notin "spotify" }
這樣,你可以使用 Where-Object
cmdlet 根據其屬性值過濾物件集合中的物件。
使用參數在 PowerShell 中創建過濾條件
在 Windows PowerShell 3.0 中引入的參數有更自然的書寫流程。使用相同的前例,讓我們使用參數來過濾特定輸出。
示例代碼:
Get-Service | Where-Object -Property StartType -EQ 'Automatic'
注意上面的命令中,這裡不是使用腳本區塊,而是將物件屬性指定為 Property 參數的值。此外,-eq
運算符如今成為一個參數,允許你傳遞 Automatic
值給它。
以這種方式使用參數現在消除了對腳本區塊的需求。然而,儘管微軟已引入參數作為更清潔的腳本方式,但我們有很好的理由在下一部分中討論使用腳本區塊。
使用多個條件語句
你可以使用運算符(例如 -and
或 -or
)將兩個或多個條件組合起來,利用腳本區塊來評估它們。然而,我們需要使用一個名為子表達式的特定 Windows PowerShell 組件,以便成功評估每個條件。
在 Windows PowerShell 中,我們可以使用子表達式在過濾語法中運行一個表達式,例如 Where-Object
。我們通過使用括號(()
)來包裹我們運行的條件語句來做到這一點。
示例代碼:
Get-Process | Where-Object { ($_.CPU -gt 2.0) -and ($_.CPU -lt 10) }
示例腳本區塊:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------ - ------ ---- - ---- - ------ -- -- ---------- -
334 21 18972 26384 5.23 3808 0 AnyDesk
635 34 13304 51264 9.56 4140 5 notepad
726 36 12820 51196 4.69 12088 5 notepad
802 46 18356 65088 7.98 10784 5 OneDrive
340 18 6472 26436 3.44 1252 5 RuntimeBroker
698 34 14672 44484 3.63 3284 5 RuntimeBroker
323 19 5732 23432 4.00 11200 5 RuntimeBroker
560 18 6440 27752 4.63 8644 5 sihost
632 31 21524 69972 2.81 6392 5 StartMenuExperienceHost
390 18 9756 30832 3.94 3084 5 svchost
523 24 8768 36312 2.17 6300 5 svchost
524 17 6416 21036 4.42 10932 5 SynTPEnh
525 22 15336 38904 3.41 2192 5 TextInputHost
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn