HOWTO · PowerShell

過濾和隔離 PowerShell 物件

在本文中,我們將討論 Windows PowerShell 物件、如何解析 PS 物件的結果以使結果可搜尋,以及使用 PowerShell 執行適當的過濾。

在 Windows PowerShell 中,執行 Get 請求時的大部分結果通常以 PowerShell 物件 (PSObject) 格式建立和顯示。PSObjects 是 PowerShell 區別於其他指令碼語言的關鍵功能之一。

但是,我們無法快速搜尋 PSObject,因為它的屬性,因此我們需要在建立搜尋索引之前隔離屬性。在本文中,我們將討論 Windows PowerShell 物件、如何解析 PS 物件的結果以使結果可搜尋,以及使用 PowerShell 執行適當的過濾。

PowerShell 物件概述

如前所述,PowerShell 物件是指令碼語言的亮點之一。每個 PowerShell 物件都具有將物件定義為一個整體的屬性。

我們以 Get-Service 為例。

示例程式碼:

Get-Service

輸出:

Status   Name               DisplayName
------   ----               -----------
Running  AarSvc_147d22      Agent Activation Runtime_147d22
Running  AdobeARMservice    Adobe Acrobat Update Service
Running  AESMService        Intel® SGX AESM

Get-Service PowerShell 物件中,我們將 StatusNameDisplayName 作為它們的屬性。要過濾掉物件,我們必須使用 Where-Object 命令在其屬性之間隔離物件。

例如,我們只能獲取 Status 型別或 Name 型別,但我們不能不先呼叫屬性就只搜尋特定關鍵字。

示例程式碼:

Get-Service | Where-Object {$_.Status -match "Stopped" }

輸出:

Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity

在本文的下一部分中,我們將討論如何將這些輸出顯示為字串而不是 PS 物件格式,並使用不同的搜尋查詢執行過濾。

使用 PowerShell 過濾輸出

為了快速過濾輸出,我們需要以字串格式顯示輸出。我們必須通過管道將命令傳遞給 Out-String 命令。

對於下面的示例,我們將它分配給一個變數,以便我們的下一個程式碼片段更容易。

示例程式碼:

$serviceOutput = (Get-Service | Out-String) -split "`r`n"

由於值儲存在變數中,上面的程式碼不會產生結果。此外,我們還執行了一個小字串操作,以每行劃分結果行。

如果我們稍後過濾,指令碼將逐行顯示它,而不是隻顯示一個完整的字串。

$serviceOutput 變數中儲存的值採用字串格式。要搜尋關鍵字,我們需要將 Select-String 命令與我們希望搜尋的關鍵字一起傳遞。

示例程式碼:

$serviceOutput | Select-String Intel

輸出:

Running  AESMService        Intel® SGX AESM
Stopped  Intel(R) Capabi... Intel(R) Capability Licensing Servi...
Stopped  Intel(R) TPM Pr... Intel(R) TPM Provisioning Service