在 Windows PowerShell 中,與所需的對象數量相比,一般生成的對象數量以及要傳遞給管道的對象數量要多得多。可使用 Format cmdlet 來指定要顯示的特定對象的屬性,但這並不能幫您解決從顯示中刪除整個對象的問題。您可能但願在管道結束以前篩選對象,所以只能在最初生成的對象子集上執行操做。ios
利用 Windows PowerShell 中的 Where-Object cmdlet,能夠測試管道中的全部對象,並將符合特定測試條件的對象經過管道進行傳遞。沒有經過測試的對象將從管道中刪除。能夠將測試條件設置爲 Where-ObjectFilterScript 參數的值。數組
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)一文