Share via


Windows PowerShell深入挖掘

Don Jones

Windows PowerShell 滿載各種功能,卻經常受到許多系統管理員的忽略。但只要您深入挖掘,必定會發現一些令人驚喜的功能。事實上,我就常常從自以為了解透徹的指令程式身上挖到一些新功能。

我在自己教授的 Windows PowerShellTM 課堂中,建議系統管理員製作一份每日一指令程式的月曆 (就像您可能會買的每日一字月曆一樣),然後每天早上 (我讓他們週末休息) 花幾分鐘的時間熟悉一個指令程式的完整功能。Windows PowerShell 大約有 130 個指令程式,也就是說,如果您嚴守這個時間表的話,大概六個月內就可以摸熟 Windows PowerShell。那時候您就準備好可以使用所有的 Exchange Server 2007指令程式了。

我想在本月份的專欄中提供一些範例,告訴您只要多花幾分鐘的時間深入探索各種指令程式功能,您可能會發掘到哪些寶藏,以及可能達到什麼樣的成效。

交出更漂亮的 HTML 報告

ConvertTo-HTML 是一個未受充分利用的指令程式。聰明的它,可以接受輸入物件集合 (服務、處理序、Windows® Management Instrumentation (WMI) 物件等等),並且將它們轉換成 HTML 表。接著您只要把這個 HTML 傳送到 Out-File,就會得出一個適合張貼在內部網路網頁伺服器的 HTML 網頁了。舉個例說,您可以安排每天早上執行下面這一行:

Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML | Out-File C:\ServiceAlert.html

這個命令會針對應該自動啟動但卻沒有執行的服務,建立一份 HTML 報告 (如 [圖 1] 所示)。

Figure 1 An HTML report of services that aren't running

Figure 1** An HTML report of services that aren't running **(按影像可放大)

當然啦,您一定希望做出好看一點的報告。還好,ConvertTo-HTML指令程式所產生的 HTML 相當簡潔,也就是說,它不會在它所建立的 HTML 程式碼中內嵌任何格式。根據 HTML 的規則指出,HTML 內最好不要加置任何格式 (能不加就不加),格式應該放置在外部階層式樣式表 (CSS),並且將 CSS 連結到 HTML,而您可以使用 ConvertTo-HTML 建立該連結。

CSS 會連結至 HTML 的 <HEAD> 區段。您只要稍微看看 ConvertTo-HTML 的說明,就會發現語法當中包含了一些您以前可能沒注意到的參數:

ConvertTo-Html [[-property] <Object[]>] [-inputObject <psobject>] [-body <string[]>] [-head <string[]>] [-title <string>] [<CommonParameters>]

–head 參數可讓您額外指定要插入指令碼 <HEAD> 區段的 HTML 程式碼。我只要稍微修改一行指令,就可以讓它連結到含有我想套用到 HTML 表的格式的現有 CSS 檔案:

Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML -title "Services" -head "<link rel='stylesheet' href='styles.css' type='text/ css' />" | Out-File C:\ServiceAlert.html

我利用 –head 參數,把連結插入到跟輸出 HTML 檔案位於同一個資料夾的 CSS 檔案中。另外我也使用 –title 參數來設定網頁的標題。結果就如 [圖 2] 所示。我所用的 Style.CSS 檔案文字看起就像這樣:

Figure 2 An HTML report that is formatted with a CSS file

Figure 2** An HTML report that is formatted with a CSS file **(按影像可放大)

body { background-color:#EEEEEE; } body,table,td,th { font-family:Tahoma; color:Black; Font-Size:10pt } th { font-weight:bold; background-color:#CCCCCC; } td { background-color:white; }

更方便篩選

本月指令程式

本月份我要探討一組指令程式: Start-Transcript 和 Stop-Transcript。這兩個指令程式的功能都是控制 Windows PowerShell 文字記錄 — 也就是說,將顯示在主控台視窗的一切,寫到您所指定的文字檔中。做法很簡單,只要執行 Start-Transcript,然後給它一個檔名就成了。接著再執行 Stop-Transcript 結束記錄,並且關閉檔案。這個動作會提供一個絕佳管道,讓命令列從使用臨機操作命令介面進入正式指令碼 — 一旦讓個別的命令列待在命令介面裡面乖乖辦事之後,接下來只要從您所建立的文字記錄檔複製和貼上它們就行了。當然您也可以將文字記錄編輯成實際的指令碼。MVP Jeffery Hicks 同志甚至還寫了一個指令碼來剖析文字記錄,並且把它們轉換成 Windows PowerShell PS1 檔案。您可以在 blog.sapien.com/current/2006/11/28/powershell-transcripts.html 找到這個指令碼。

接下來讓我們看看 Get-WMIObject指令程式。如 Windows PowerShell 內建說明所示,您可以從它的語法看出它還有未經利用的功能:

Get-WmiObject [-class] <string> [[-property] <string[]>] [-namespace <string>] [-computerName <string[]>] [-filter <string>] [-credential <PSCredential>] [<CommonParameters>]

Windows PowerShell 新手最常犯的一個錯誤,就是發出像這樣的 WMI 命令:

Gwmi Win32_NTLogEvent –comp Server2

這個命令會從 Server2 擷取事件記錄項目,而且是所有的事件記錄項目。這項工作勢必讓 Server2 花上一段時間來進行處理和傳輸,而 Windows PowerShell 也得耗上好一陣子來使用這麼一個大型集合。

所以囉,還是請 Server2 尋找和傳送您真正關心的事件比較妥當。您可以利用 WMI 查詢語言 (WQL) 查詢幫您辦妥這件事。也許有些人覺得這種查詢語法很難,其實使用 Windows PowerShell 時,只需要以 –filter 參數指定 WQL 查詢的篩選部分就行了:

Gwmi Win32_NTLogEvent –comp Server2 –filter "EventIdentifier=1024"

這個動作會從所有的記錄檔中,擷取所有事件識別碼為 1024 的事件。請注意篩選條件是以 = 作為比較運算子,而不是 Windows PowerShell –eq 運算子。因為您是將篩選器傳遞到遠端電腦的 WMI 服務進行處理,所以必須採用 WMI 語法,而不是 Windows PowerShell 語法來撰寫條件。

在其他像 Get-ChildItem 的指令程式上其實有一個 –filter 參數,這是在 Dir 和 Ls 等別名背後的指令程式。在大多數的情況下,–filter 參數會將您的篩選器條件直接傳到基礎技術,這就是我所謂的來源篩選,這麼做通常會比透過 Where-Object指令程式執行所有的物件,最後篩選出您不想要的物件還要快許多。

受到忽略的指令程式

這種一天學習一個指令程式的方法,無疑可以幫助您更加了解您自以為熟知的指令程式。但是採用每日一指令程式的月曆,另一個原因是為了避免完全忽略您可能怎麼也發掘不到的指令程式。我最喜歡的其中一個指令程式,也是許多人都沒用到的 Resolve-Path。如果您輸入一個萬用字元路徑,這個指令程式會傳回一組符合該路徑的檔案和資料夾名稱。它跟 Get-ChildItem指令程式很類似 (也就是您所熟悉的 Dir 或 Ls 別名),但它不會傳回整個檔案和資料夾物件,而只傳回字串,這些字串可以傳送到其他的指令程式供進一步篩選或處理之用。用法非常簡單:

Resolve-Path C:\P*

這個簡單的一行會傳回像是 C:\Program Files、C:\Processes.txt 等路徑。[圖 3] 就是兩個這樣的指令程式範例。

Figure 3 Using the handy, though overlooked, Resolve-Path指令程式

Figure 3** Using the handy, though overlooked, Resolve-Path指令程式 **(按影像可放大)

從頭開始

當您準備好開始一天體驗一個指令程式時,請執行 Get-Command 的別名 Gcm。這時候畫面會出現一份 Windows PowerShell 認識的指令程式清單,包括您透過嵌入式管理單元加入的指令程式,例如 Exchange Server 2007 管理命令介面、PowerShell Community Extensions 等等。只要從清單中挑選一個 (我第一個挑的是 Add-Content),然後閱讀它的說明,就可以開始了:

Help Add-Content –full

您需要閱讀完整的說明 (而不是較為簡單的預設說明),完整的說明含有每個參數用途的完整描述,指令程式的一些使用範例,還有其他詳細的資訊。花點時間體驗一下指令程式吧(您可以使用虛擬機器,而不必動用到實際執行環境)。我建議您每天挪出 10 分鐘的時間 — 而且都在同一個時間,讓自己養成習慣。要不了多久,您對 Windows PowerShell 所提供的所有功能就會有深入的了解。

Don Jones 是 SAPIEN Technologies 的指令碼語言大師,也是《Windows PowerShell:TFM》(SAPIEN Press,2007 年) 一書的作者之一。您可以透過下列網站與他聯絡:www.ScriptingAnswers.com.

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.