如何在 PowerShell 中使用 Where-Object 命令

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

當你在一個物件集合中使用 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 是一個過濾器。它允許我們構造一個返回 TrueFalse 的條件。根據情況的結果,該 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 屬性值的進程列表。它僅顯示 ProcessNamespotify 的進程。

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
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相關文章 - PowerShell Statement