HOWTO · PowerShell

在 PowerShell 中嵌套 ForEach-Object 和 Where-Object

本教程將討論 PowerShell 中的 Where-Object 和 ForEach-Object。

本頁內容

PowerShell 的 Where-ObjectForEach-Object Cmdlet 是過濾和處理數據的不可或缺的工具,能以有系統和高效的方式進行操作。通過利用這些 cmdlet 的強大功能,PowerShell 用戶可以精確而輕鬆地操控數據集,根據特定條件執行操作並輕鬆迭代集合。

本文說明了 Where-ObjectForEach-Object 的用法,展示了如何單獨和結合使用它們來執行各種任務。從過濾 Windows 服務到對數據進行計算,甚至在更複雜的情況下實施嵌套操作,這些 cmdlet 提供了一個強大的框架,用於 PowerShell 腳本中的數據操作。

在 PowerShell 中使用 Where-Object Cmdlet

Where-Object 是一個內建的 cmdlet,用於過濾輸出命令並顯示你想看到的信息。一般來說,Where-Object 像是一個過濾器。

它還允許你創建可以返回真假值的條件。

在下面的例子中,我們將找到所有在我們的電腦上運行的 自動 模式服務。為此,命令大致如下:

Get-Service | Where-Object -FilterScript { $_.StartType -EQ 'Automatic' }

在這段代碼中,我們首先使用 Get-Service Cmdlet 獲取一個 Windows 服務的集合。該集合然後被管道到 Where-Object Cmdlet,並在管道中的每個服務對象上應用過濾腳本。

在過濾腳本中,我們評估每個服務對象的 StartType 屬性,以確定它是否等於字符串 "Automatic"。如果服務的 StartType 屬性符合該標準,它將通過管道傳遞。

這個過濾腳本有效地選擇了啟動類型設置為 "Automatic" 的服務。這次過濾操作的結果是原始服務集合的一個子集,只包含配置為自動啟動的服務。

在運行上述命令行後,你將得到如下所示的輸出:

powershell 嵌套 foreach-object where-object - 輸出 1

在 PowerShell 中使用 ForEach-Object Cmdlet

ForEach-Object 將讓你對每個指定的對象運行特定任務。在我們下面的例子中,我們將每個對象除以 1024

我們例子的代碼將如下:

3000, 567980, 112432 | ForEach-Object -Process { $_ / 1024 }

在這段代碼中,我們使用 ForEach-Object Cmdlet 迭代一組三個數字:3000567980112432。在腳本塊中,我們對每個數字進行加法計算,將其除以 1024

這個計算對集合中的每個數字單獨執行。因此,我們得到一個新的集合,包含除法操作的結果,其中原始集合中的每個數字都被除以 1024

在運行上述命令行後,你將得到如下所示的輸出:

powershell 嵌套 foreach-object where-object - 輸出 2

在 PowerShell 中使用嵌套的 ForEach-ObjectWhere-Object

ForEach-ObjectWhere-Object cmdlet 的組合允許強大的數據操作和過濾操作。嵌套的方法,即在另一個 cmdlet 的範疇內使用一個 cmdlet,增強了迭代和選擇性處理數據的能力。

這種方法在處理數組或對象集合並根據特定標準執行操作時特別有用。

示例:

$MyArray = ("python", "explorer", "edge")
$MyArray | ForEach-Object { Get-Process | Where-Object ProcessName -EQ $_ | Out-Host }

在這段代碼中,$MyArray 包含一個進程名稱的列表。ForEach-Object Cmdlet 對數組中的每個進程名稱進行迭代。

在腳本塊中,Get-Process 獲取所有運行中進程的信息,而 Where-Object 根據 ProcessName 屬性與當前進程名稱($_)匹配的條件過濾這些進程。然後,過濾後的進程對象通過 Out-Host 輸出到控制台。

輸出:

powershell 嵌套 foreach-object where-object - 輸出 3

在 PowerShell 中使用帶有 if 語句的嵌套 ForEach-ObjectWhere-Object

在 PowerShell 腳本中,嵌套的 if 語句提供了一種在循環和其他控制結構中應用條件邏輯的方法。當與 ForEach-ObjectWhere-Object Cmdlet 結合時,嵌套 if 語句支持複雜的數據過濾和處理操作。

這種方法在根據多個標準處理數據時提供了靈活性和細致性。它在需要對數據操作進行精細控制的情境中特別有用。

示例:

$MyArray = @("Value1", "Value2", "Value3")
$MyArray | ForEach-Object {
    if ($_ | Where-Object { $_ -eq "Value1" -or $_ -eq "Value3" }) {
        $_ | Out-Host
    }
}

在這段代碼中,$MyArray 包含一組值。ForEach-Object Cmdlet 對數組中的每個值進行迭代。

在嵌套的 if 語句內,Where-Object 根據條件過濾值,確認它們等於 "Value1""Value3"

如果條件滿足,該值將通過 Out-Host 輸出到控制台。

輸出:

{CODE_BLOCK_8}

結論

憑藉 Where-ObjectForEach-Object 等多功能 cmdlet,PowerShell 使得用戶能夠靈活運用複雜的數據處理能力。無論是從集合中選擇特定元素,應用條件邏輯,還是對每個項目進行迭代執行任務,PowerShell 提供了所需的工具來簡化工作流程並提高生產力。

通過掌握這些 cmdlet 並理解其細微之處,用戶可以充分利用 PowerShell 進行高效的數據操作和腳本任務,開啟自動化和管理的無限可能性。