共用方式為


Windows PowerShell 篩選與格式的愛恨情愁

Don Jones

目錄

向左的篩選器,在來源
格式正確,那麼就大功告成與其
深入探討

在 [Windows PowerShell 最有價值專家 (MVP)] 郵件清單我們 ’ve 最近被討論,並嘗試將文件 — Windows PowerShell 「 問題 」。您知道我們的意義:這些小的東西,don’t 的運作完全方式 ’d 想一樣 — 並,真的可以導致問題,當您 ’re 學習殼層。

兩個最大的問題牽涉到的篩選及格式化。 我提到在清單中我試著協助同仁避免這些方面的問題記住篩選左,右格式。寄給我發生片語可能會以好的方式,Windows PowerShell 更有效率地使用資料行的因此我們如下。

向左的篩選器,在來源

使用任務的可用 Active Directory (AD) 管理 Cmdlet] (您可以找到它們在 quest.com/powershell) 一個的很多,鼓勵其他人也使用它們。 一個指令程式取得-QADUser,被為了從 AD 擷取使用者。 看到執行類似指令的人並不常見的:

Get-QADUser | Where-Object { $_.Department -eq "Sales" } | Set-QADUser -department "Inside Sales"

這會變更每個人的 AD 部門] 屬性設定為銷售,使而屬性設定為內部的銷售。 問題是,篩選會發生。 第一個指令程式取得-QADUser,要擷取整個網域中的每個單一使用者。

幸運的是,它不會從每一位使用者擷取每個屬性,預設情況下,但在一個大型的網域它將執行多個足夠傷害為不佳的網域控制站 (DC) struggles 來傳輸到您的用戶端電腦的使用者帳戶資訊。 您的用戶端必須再檢查一次每個帳戶,並捨棄那些不具有包含值銷售部門屬性。 什麼是浪費!

這就是為什麼我要 「 左篩選 」。一定要移動篩選準則為目前他命令列的左邊為 possible.In 這種情況下,取得 QADUser 指令程式本身發生問題時支援篩選:

Get-QADUser -Department "Sales" | Set-QADUser -department "Inside Sales"

不再還有位置物件指令程式的需要。 更佳的靜止,藉由使用這個的語法取得 QADUser 是傳輸篩選器準則的 DC 到 DC 擷取並傳送只有帳戶符合此條件。 網域控制站是好在篩選 — 它們做所有每天長真的 — 讓我們正在將放在最佳的可能位置快速執行篩選。 您的用戶端不需要處理來自的 DC,讓您的命令會執行速度更快、 更有效率的多個物件。

以下是使用 Windows 管理檢測 (WMI) 的另一個範例:

Get-WmiObject CIM_DataFile -computerName Server2 | Where { $_.FileName -like "*.dll" }

這會連絡上 Server2 WMI,取得所有 CIM_DataFile 類別的執行個體 — 用來表示在硬碟上的檔案,和篩選出那些不是 DLL 檔案。 因此您在離開該伺服器上的 DLL 檔案的清單。 但這會花時間來執行,將您正在帶的所有伺服器的檔案資訊傳送到您的電腦。 一次,移動篩選進一步的左邊會幫助而且很可能執行這項操作,在這種情況下:

Get-WmiObject CIM_DataFile -computerName Server2 -filter "FileName LIKE '*.dll'"

您需要使用語法稍有不同的篩選器,因為此語法不正在執行的 Windows PowerShell。 而是,它的傳輸到 WMI 在遠端電腦上。 仍然需要的時間來執行,但是它會包含較少的網路流量,最後,Server2 和您的電腦上較少負荷。 取得在讀取指令程式 '' 的習慣請參閱 Cmdlet 提供何種篩選選項,以協助檔案 (說明取得-WmiObject,在這種情況下)。 只依賴位置物件時取得的 * 您正在使用的指令程式不支援您需要在篩選。

格式正確,那麼就大功告成與其

與相關之其他 gotcha 格式-* 指令程式,例如格式化表格和格式清單。 我會看到新的執行如下:

Get-Process | Format-Table ID,VM,Name | Export-CSV c:\processes.csv

它不會運作。 喔,會執行不過您不想結果。 如果第二個真的讀取該指令,您可能會懷疑完全預期還是會發生。 您已經發現一連串的處理程序,它們格式化成表格) 後,您有想要成為.CSV 檔案之資料表嗎? 如果結束目標是要取得只包含特定的物件屬性的.CSV 檔案,您就會執行此:

Get-Process | Select-Object ID,VM,Name | Export-CSV c:\processes.csv

如果目標是要格式化的單欄式表格進入文字檔案,就可以這樣做:

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

但是您不能混合,並符合這兩種方法。 了解原因,是這需要一些背景上這些格式的指令程式如何,以及使用方式 [輸出]-* 指令程式工作。

Windows PowerShell 管線 — 這是您的命令中執行-是硬式編碼在結束 [Out-Default 指令程式。 這個 Cmdlet 會稍有多個重新導向物件 Out-Host,這是負責在螢幕上顯示輸出。

任何命令列 — 或管線,使用正確的詞彙),並不會在輸出的結束 * 指令程式,預設情況下,最後會在 Out-Default,這是說它一樣在結束 Out-Host。 訣竅是 [輸出]-* 指令程式不知道該怎麼處理物件 — 他們需要轉換成格式化指示的物件。 因此當 Out-Host 取得處理序物件,傳送這些物件的格式的其中一個 * 指令程式。 它使用哪一種 — 表格、 寬,自訂] 或 [清單 — 以一組我無法涵蓋在本專欄中的規則為基礎。 但它會傳送物件,其中,格式-* 指令程式所需的物件,並產生格式設定的指示。 [輸出]-* 指令程式知道如何使用這些格式化指示,而且它們使用它們來建立任何顯示是必要。

因此讓我們將,放入實際的條件:有三或四個主要輸出的 * 您將會碰到而且經常使用的指令程式:out-host,out-file,out-printer 和 out-string。

這些被為了使用只,格式指示和再採取這些指示,分別建構螢幕顯示,文字檔案、 印表機頁面或一個的字串。 取得這些格式化指示,唯一方法是透過格式-執行物件 * 指令程式 — 和格式化指示唯一格式-* 指令程式產生。 因此當您執行這:

Get-Process | Format-Table ID,VM,Name |Export-CSV c:\processes.csv

什麼進入.CSV 檔案是由 [格式化表格,格式指示 — 可能根本不是您所預期。 執行格式-後 * 指令程式,您原始的物件將會遺失,而您是以格式指示。 以下是另一個簡單的規則,讓您:格式正確。 亦即發送到極端右邊的命令列的格式設定的指令程式。 唯一可能來自於之後格式-* 指令程式會傳回一個換行字元或輸出-* 指令程式。 這就是為什麼這是合法的:

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

out-File 知道如何閱讀這些格式設定的指示,並用來建立文字檔案。 這也是合法的:

Get-Process | Format-Table ID,VM,Name 

您在這裡,依賴 「 硬式編碼 Out-Default 」 的重新導向至 Out-Host、 會知道如何使用格式設定的指示,並建立主應用程式或主控台,] 視窗中的文字顯示。 保留格式設定為目前盡可能右邊,再藉著,沒有其他的項目或輸出的 * 指令程式,您會很好。

一個更多的秘訣:不應該遵循出-* 指令程式因為只有一個例外狀況,其中沒有發出至管線的物件。 中有任何依照輸出的還有沒有必要 * 指令程式,因為不會變成它。

深入探討

我希望我已經協助您瞭解為什麼這些因素是方式它們。 但是在至少,請記住篩選器向左,格式正確 」而且您應該能夠保持超出問題完全避免這些問題。

許多 Windows PowerShell 小 quirks 變得容易瞭解,只要您真正瞭解如何及為何殼層運作方式的話。 若要瞭解什麼發生在罩下時間 — 並套用的知識,每當您在殼層中收到未預期的結果 — 快速地將您 Windows PowerShell 高手。

Don Jones 是其中一個民族的最有經驗的 Windows PowerShell trainers 和寫入器。 他的部落格 ConcentratedTech.com; 在每週的 Windows PowerShell 秘訣您也可能會連絡他,或詢問他那里問題。