在 PowerShell 中使用 Where-Object 命令

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. PowerShell 中的 Where-Object Cmdlet
  2. 在 PowerShell 中使用指令碼塊建立篩選條件
  3. 在 PowerShell 中使用引數建立篩選條件
  4. 使用多個條件語句
在 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 團隊引入引數。

在 PowerShell 中使用引數建立篩選條件

在 Windows PowerShell 3.0 中引入的引數在其編寫方式上更加自然。使用與前面相同的示例,讓我們使用引數來過濾特定的輸出。

示例程式碼:

Get-Service | Where-Object -Property StartType -eq 'Automatic'

請注意,該命令不使用指令碼塊,而是將物件屬性指定為 Property 引數的引數值。此外,-eq 運算子現在是一個引數,允許你將 Automatic 值傳遞給它。

以這種方式使用引數現在消除了對指令碼塊的需要。但是,儘管 Microsoft 已將引數作為一種更簡潔的指令碼編寫方式引入,但我們有充分的理由使用指令碼塊,我們將在本文的下一部分討論。

使用多個條件語句

你可以使用運算子(如 -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 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