Powershell對象條件查詢篩選

在 Windows PowerShell 中,與所需的對象數量相比,一般生成的對象數量以及要傳遞給管道的對象數量要多得多。可使用 Format cmdlet 來指定要顯示的特定對象的屬性,但這並不能幫您解決從顯示中刪除整個對象的問題。您可能但願在管道結束以前篩選對象,所以只能在最初生成的對象子集上執行操做。ios

利用 Windows PowerShell 中的 Where-Object cmdlet,能夠測試管道中的全部對象,並將符合特定測試條件的對象經過管道進行傳遞。沒有經過測試的對象將從管道中刪除。能夠將測試條件設置爲 Where-ObjectFilterScript 參數的值。數組

使用 Where-Object 執行簡單測試

FilterScript 的值爲計算結果爲 True 或 False 的腳本塊(由大括號 {} 括住的一個或多個 Windows PowerShell 命令)。這些腳本塊很是簡單,但建立這些腳本塊則須要瞭解 Windows PowerShell 的另外一概念,即,比較運算符。比較運算符可比較該運算符兩側的項。比較運算符以「-」字符開頭,後跟名稱。基本的比較運算符幾乎對全部類型的對象適用。更高級的比較運算符只適用於文本或數組。測試

請注意:spa

默認狀況下,在處理文本時,Windows PowerShell 比較運算符不區分大小寫。.net

出於分析方面的考慮,諸如 <、> 和 = 之類的符號不能用做比較運算符。所以,比較運算符改由字母組成。基本的比較運算符以下表所示:orm

 

比較運算符對象

含義blog

示例返回 True教程

-eqip

等於

1 -eq 1

-ne

不等於

1 -ne 2

-lt

小於

1 -lt 2

-le

小於或等於

1 -le 2

-gt

大於

2 -gt 1

-ge

大於或等於

2 -ge 1

-like

相似(用於文本的通配符比較)

"file.doc" -like "f*.do?"

-notlike

不相似(用於文本的通配符比較)

"file.doc" -notlike "p*.doc"

-contains

包含

1,2,3 -contains 1

-notcontains

不包含

1,2,3 -notcontains 4

 

Where-Object 腳本塊使用特殊的變量「$_」來引用管道中的當前對象。此處的示例將演示該變量的工做原理。若是存在一個數字列表,而您只需返回小於 3 的數字,則可經過鍵入如下命令來使用 Where-Object 篩選數字:

PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}

1

2

 

根據對象屬性進行篩選

因爲 $_ 引用當前的管道對象,所以可訪問其屬性以進行測試。

做爲示例,咱們能夠查看 WMI 中的 Win32_SystemDriver 類。特定系統中可能存在幾百個系統驅動程序,而您可能只對某一組特定的系統驅動程序感興趣,例如。當前正在運行的那些系統驅動程序。若是使用 Get-Member 來查看Win32_SystemDriver 成員(Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property),則將看到的相關屬性是「State」,而且該驅動程序運行時,它具備值「Running」。鍵入如下命令能夠只選擇正在運行的系統驅動程序以進行篩選操做:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}

 

這仍會生成一個很長的列表。您可能還但願經過測試 StartMode 值來進行篩選,以便只選擇設置爲自動啓動的驅動程序:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"}

 

DisplayName :RAS Asynchronous Media Driver

Name        :AsyncMac

State       :Running

Status      :OK

Started     :True

 

DisplayName :Audio Stub Driver

Name        :audstub

State       :Running

Status      :OK

Started     :True

 

因爲咱們已瞭解哪些驅動程序正在運行,所以這將產生許多咱們再也不須要的信息。實際上,此時咱們可能須要的信息僅僅是名稱和顯示名稱。如下命令只包括這兩個屬性,從而獲得更簡單的輸出:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName

 

Name                                    DisplayName

----                                    -----------

AsyncMac                                RAS Asynchronous Media Driver

Fdc                                     Floppy Disk Controller Driver

Flpydisk                                Floppy Disk Driver

Gpc                                     Generic Packet Classifier

IpNat                                   IP Network Address Translator

mouhid                                  Mouse HID Driver

MRxDAV                                  WebDav Client Redirector

mssmbios                                Microsoft System Management BIOS Driver

 

上述命令中存在兩個 Where-Object 元素,而他們可經過使用 –and 邏輯運算符,以單個 Where-Object 元素的形式表示出來,以下所示:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName

 

標準的邏輯運算符以下表所示:

 

邏輯運算符

含義

示例返回 True

-and

邏輯與;兩邊都爲 True 時值爲 True

(1 -eq 1) -and (2 -eq 2)

-or

邏輯或;其中一邊爲 True 時值爲 True

(1 -eq 1) -or (1 -eq 2)

-not

邏輯非;對 True 和 False 取反

-not (1 -eq 2)

!

邏輯非;對 True 和 False 取反

!(1 -eq 2)

 

說明 :此文借鑑csdn博客erway的博客PowerShell基礎教程(15)——從管道中刪除對象 (Where-Object)一文

相關文章
相關標籤/搜索