易學易用的 Windows PowerShell

作者: 賴榮樞
http://www.goodman-lai.idv.tw

本頁內容

腳本語言的源起與目的
Shell Script
巨集語言
Windows PowerShell 誕生
下載、安裝、執行 Windows PowerShell
初探 Windows PowerShell
Windows PowerShell 指令
Windows PowerShell 的管線功能
新的腳本語言
善用腳本語言
善用 Windows PowerShell
參考資料及網路資源

Windows PowerShell 是微軟為 Windows 環境所開發的 shell 及腳本語言技術,這項全新的技術提供了豐富的控制與自動化的系統管理能力;而「腳本語言」(scripting languages)則是用來編寫程式的電腦語言。腳本語言通常都有簡單、易學、易用的特性,目的就是希望能讓寫程式的人(開發者)快速完成程式的編寫工作。本文將簡述腳本語言的起源與目的,並且介紹 Windows PowerShell。

  • 腳本語言的源起與目的

  • Shell Script

  • Windows PowerShell 誕生

  • 下載、安裝、執行 Windows PowerShell

  • 初探 Windows PowerShell

  • Windows PowerShell 指令

  • Windows PowerShell 的管線功能

  • 新的腳本語言

  • 善用腳本語言

  • 善用 Windows PowerShell

腳本語言的源起與目的

腳本語言是電腦程式語言(programming languages)的一種,因此也能讓開發者藉以編寫出讓電腦聽命行事的程式。但是「以簡單的方式快速完成某些複雜的事情」通常是創造腳本語言的重要原則,基於這項原則,使得腳本語言通常比 C、C++ 或 Java 之類的「系統程式語言」(system programming languages)「簡單」、「容易」,也讓腳本語言另有一些所謂「腳本語言的特性」:

  • 語法和結構通常比較簡單

  • 學習和使用通常比較簡單

  • 通常以容易修改程式的「直譯」作為執行方式,而不需要編譯

  • 程式的開發產能優於執行效能

腳本語言源自早期文字模式的命令列電腦系統,在當時只能以鍵盤敲入命令才能操作電腦的情況下,為了減少某些需要不斷重複敲入命令的情況,電腦作業系統的命令處理器(在 UNIX 的世界這通常稱為 command shell)提供了「批次操作」(batch operation)的方式,讓電腦操作者可以將一整個流程的命令,循序、逐行的編排在稱為「批次檔」(batch file,也稱為 batch jobs 或 shell scripts)的文字檔,若有相同的操作需要處理,即可載入批次檔而不需再次重複敲入指令。

Shell Script

由於批次操作對命令列的電腦系統操作者幫助甚大,因此作業系統的命令處理器也不斷加強功能,尤其加入了許多程式語言的重要元素,包括變數、迴圈、條件判斷等等,讓電腦操作不只是循序的執行命令,而能更精準的操控電腦系統的運作;這種程式設計通常稱為 shell programming。因此,不論是大型主機的系統操作員,或者是整個電腦環境的系統管理員、網路管理員,shell programming 都是相當重要的技能,這項技能可以有效且快速的管控轄下的電腦。

UNIX 系統的 shell 相當多樣,例如 Bourne Shell(sh)、Bourne-Again Shell(bash)、Korn Shell(ksh)、C Shell(csh)等等;以下簡述常見的 UNIXshell。

  • Bourne Shell(sh):這是歷史悠久且重要的 UNIX shell,是由貝爾實驗室的研究員 Stephen Bourne 為第七版的 UNIX 所創造,這種 shell 的執行檔副檔名就是 .sh。

  • Bourne-Again Shell(bash):光從名稱就能猜出 bash 與 sh 是有淵源(甚至說「血緣」)。bash 是由 Brian Fox 於 1987 年為 GNU 所創造,1990 年起,Chet Ramey 成為主要的維護者。bash 是相當流行的 shell,除了是大多數 Linux 預設的 shell,在許多 UNIX-like 系統也有其蹤跡(例如 Mac OS X Tiger),甚至也能透過 Cygwin 在 Windows 系統執行。

  • Korn Shell(ksh):是由貝爾實驗室的研究員 David Korn 在 80 年代初期所創造,ksh 除了與 sh 完全相容,也包含了若干 C Shell 的功能。

  • C Shell(csh):是由 Bill Joy(後來創辦了昇陽公司)為 BSD UNIX 系統所創造。csh 源自於第六版 UNIX 的 Thompson shell(是 Bourne Shell 的前身),因為語法類似 C 語言而得名。

除了上述盛行於 UNIX 環境的 shell,其他作業系統也有專屬的 shell 或 shell 腳本語言,例如蘋果麥金塔系統的 AppleScript、IBM OS/2 的 REXX(REstructured eXtended eXecutor)。而 DOS 以及早期 Windows 的 shell 則是 Command.com,但也因功能較弱,因此有 4DOS、4NT 等軟體可增強功能,Windows 2000 以及之後的 Windows 則改以功能較強 cmd.exe 作為 Windows shell,並且以 Windows Script Host 作為腳本語言執行環境,大幅提高了 Windows shell 的可用性。而微軟也將會推出功能更強的 Windows shell,稱為 Windows PowerShell。

雖然現在許多電腦系統都提供了圖形化的操作方式,但是卻都沒有因而停止提供文字模式的命令列操作方式,相反的,許多系統反而更加強這部份的功能,例如 Windows 就不只加強了操作命令的功能和數量,也一直在改善 shell programming 的方式。而之所以要加強、改善,當然是因為不夠好;Windows 的圖形化操作方式對單一用戶端電腦的操作,已經相當方便,但如果是一群用戶端電腦,或者是 24 小時運作的伺服器電腦,圖形化操作方式有時會力有未逮。

巨集語言

巨集語言也可視為腳本語言的分支,兩者也實質上的相同之處。巨集語言通常附屬於某一種軟體,例如微軟 Office、Visual Studio、Adobe Photoshop 都內建了巨集語言的功能,使用者可利用軟體所附的巨集語言,達到自動化的結果(例如調整某個資料夾所有 PSD 圖檔的解析度)。而這類巨集語言也大多提供錄製巨集的功能,自動記錄使用者的鍵盤按鍵,讓使用者不必寫程式,就能產生巨集程式。此外,C 語言和組合語言也有巨集功能,是以搜尋及取代進行編譯或組譯之前的前置處理。

Windows PowerShell 誕生

UNIX 的世界有功能強大的 shell,現在 Windows 環境也有了;Windows PowerShell 不僅提供功能相當於BASH的命令列 shell,同時也內建腳本語言以及輔助腳本程式的工具。Windows PowerShell 是以 .NET 技術為基礎,並且與現有的 WSH 保持回溯相容,因此 Windows PowerShell 的腳本程式不僅能存取 .NET CLR,也能使用現有的 COM 技術。

Windows PowerShell 包含了數種系統管理工具、簡易且一致的語法,提升管理者處理常見如登錄資料庫、WMI。Exchange Server 2007 以及 System Center Operations Manager 2007 等伺服器軟體都將內建 Windows PowerShell。

Monad 是 Windows PowerShell 之前的專案代號,Microsoft Shell(MSH)則是另一個別名;簡而言之,Windows PowerShell 具有以下特點:

  • 一致性的設計讓所有工具和系統資料的使用語法、命名原則都相同。

  • Windows PowerShell 的腳本語言不僅簡單易學,而且能支援現有的腳本程式和命令列工具。

  • 內含 129 種稱為 cmdlet 的標準工具,可用來處理常見的系統管理工作,例如登錄資料庫、系統服務、形成、WMI、事件日誌等等。

  • 具備完整的擴充功能,獨立軟體商或開發者都能很容易的自行擴充。

下載、安裝、執行 Windows PowerShell

Windows PowerShell 可安裝於 Windows XP 以及之後的用戶端或伺服端 Windows 作業系統,包括:

  • 用戶端:Windows XP、Windows XP Service Pack 1、Windows XP Service Pack 2、Windows Vista

  • 伺服端:Windows Server 2003、Windows Server 2003 R2、Windows Server 2003 Service Pack 1

而 Windows PowerShell 除了有 32 位元版本,也還有 x64 和 ia64 等兩個 64 位元版本,可以安裝在這兩種 64 位元 Windows 平台。此外,由於執行 Windows PowerShell 需要 .NET Framework 2.0,因此請先替電腦安裝 .NET Framework 2.0。目前 Windows PowerShell 是為 RC1 階段,官方下載的網址請參閱文後(下載前需經過簡單的註冊手續)。下載回來的檔案是 ZIP 壓縮檔,只要解壓縮並執行副檔名為 .msi 的檔案即可安裝,安裝過程相當簡單,只要依照精靈指示即可順利完成。

安裝之後,可以利用以下三種方式執行 Windows PowerShell:

  • 位於『開始 / 所有程式』的『Windows PowerShell』捷徑。

  • 在『開始 / 執行』的『執行』交談窗輸入 powershell。

  • 在任何『命令提示字元』視窗的命令提示符號輸入 powershell。

Windows PowerShell 視窗看起來類似原本的『命令提示字元』視窗,而我通常也都會調整視窗和字型的大小,以方便作業。

初探 Windows PowerShell

任何 shell 都有列出目錄、檔案的指令,Windows PowerShell 呢?先輸入 DOS 的 dir 試試吧!

圖 1 dir 指令執行結果
圖 1 dir 指令執行結果

嗯!dir 果然也通,但是列示的方式不同於以往的 dir 指令。一時興起,我輸入了 UNIX 的 ls 指令,視窗顯示了與 dir 指令相同的結果;真有趣(這時候我尚未閱讀任何 Windows PowerShell 文件,只是很直覺輸入指令)。

Windows PowerShell 指令

cmdlet 是 Windows PowerShell 的指令,這相當於 DOS 或其他 shell 的內建指令(但是剛剛輸入的 dir 或 ls 並不是 cmdlet,這稍後將會說明),cmdlet 的發音方式是 command-let。cmdlet 名稱的格式都是以連字符號隔開的一對動詞和名詞,並且通常都是單數名詞。例如可以線上查詢 cmdlet 用法的 cmdlet 即為 get-help。cmdlet 名稱的動詞部分大致有 get、set、add、remove 等等(Windows PowerShell 的操作與 DOS 相同,輸入的字母都不分大小寫)。

get-help 是頗為重要的 cmdlet,可以線上查詢所有的 Windows PowerShell 指令和說明文件。例如:

  • get-help *:列出所有的主題,包括指令和概念。

  • get-help * | more:列出所有的主題,包括指令和概念,而且顯示滿整個視窗就暫停。

  • get-help about*:列出所有的概念主題,例如萬元字元、foreach 迴圈。

  • get-help get*:列出所有 get 開頭的主題。

  • get-help {<指令名稱或主題名稱>}:列出指定的指令或主題的說明,例如 get-help dir 可以查詢 dir 指令的用法,而 get-help about_wildcard 可以查詢「萬用字元」這項主題的用法。

此外,也可以用 help 取代 get-help,最大的好處是 help 顯示滿整個視窗,預設就會自動暫停。

一開始曾經使用了 dir 和 ls,雖然這並不是 cmdlet,但的確可用於 Windows PowerShell。原來這類的指令稱為 alias(化名),類似 cmdlet 的捷徑,例如 dir 和 ls 實際上都是 get-ChildItem 的 alias,get-ChildItem 才是 cmdlet;而 get-ChildItem 的功能,是列出磁碟機指定位置的子項目。

Windows PowerShell 的指令包含了許多內建的 alias,這些 alias 都是我們原本熟悉的 DOS 或 shell 指令,除了上述的 dir 和 ls,例如原本 DOS 指令的 rm、rmdir、rd、cls、copy 等,以及 BASH 的 cat、sleep、clear、cp 等,都是 Windows PowerShell 的 alias,也就是說,可以直接使用這些 alias;若要列出所有的 alias,可以用 get-alias 指令。除了使用內建的 alias,Windows PowerShell 也允許使用者以 set-alias 建立自己的 alias。

除了 cmdlet 和 alias,Windows PowerShell 的指令還有 Application 和 Function 兩種類型,前者指的是獨立的程式檔(在 DOS 時代稱為外部指令),後者是有名稱的程式碼區塊,也就是函式:不論 Application 或 Function 都可以當作 Windows PowerShell 指令來用,也可以用在腳本程式裡。利用 get-command *,可以列出所有的指令。

Windows PowerShell 的管線功能

DOS 或 UNIX shell 都能利用「管線符號」(pipeline symbol),將指令的執行結果移轉到另一個指令,讓另一個指令處理前一個指令轉來的資料。Windows PowerShell 的管線符號也是 |,例如之前用過的 get-help * | more,就是將 get-help * 的結果轉給 more,而 more 會讓結果顯示滿整個視窗就暫停。

管線是各種 shell 環境的「黏合」最佳例證,例如管線就黏合了 Windows PowerShell 的各個指令,進而讓各個指令完成一件工作。再舉幾個管線的例子。首先是:

ipconfig | findstr "Address"

被管線黏合的 ipconfig 和 findstr 都是 Win32 既有的外部指令,前者會顯示、設定電腦的 IP 位址,後者則能以各種方式找出特定字串。以上的敘述是將 ipconfig 的執行結果轉給 findstr,並讓 findstr 找出執行結果的 Address 字串。

圖 2 ipconfig | findstr "Address"執行結果
圖 2 ipconfig | findstr "Address"執行結果

再舉兩個例子。以下的敘述會列出已停止的系統服務,但是由 get-service 和 where-object 相互協力完成,前者列出所有的系統服務,後者過濾出狀態為 Stopped 的系統服務:

get-service | where-object {$_.Status -eq "Stopped"}

但以上敘述的結果會以系統服務的名稱作為排列方式,若想以系統服務的「顯示名稱」依序排列,可以再加上 sort-object,並也以管線黏合:

get-service | where-object {$_.Status -eq "Stopped"} | sort-object -property DisplayName

圖 3 三重管線範例的執行結果
圖 3 三重管線範例的執行結果

新的腳本語言

微軟為 Windows PowerShell 創造了新的腳本語言,但若你熟悉任何一種腳本語言,你也能很快熟悉 Windows PowerShell 的腳本語言。基本上,只要將 Windows PowerShell 的指令放進副檔名為 .ps1 的文字檔,這個檔案就是 Windows PowerShell 的腳本程式了。因此在熟悉了 Windows PowerShell 的指令操作之後,只要再熟悉 Windows PowerShell 腳本語言的變數、陣列、迴圈控制、條件控制,大致上就語言的部分就差不多。但若要以腳本程式管理 Windows 系統,除了要熟悉腳本語言,當然也必須熟悉 Windows PowerShell 指令和 WMI,畢竟腳本語言的目的只是黏合這些現成的軟體元件。

執行腳本程式還有幾點注意事項,首先要確定腳本程式所在的位置是在執行路徑裡。再者,由於 Windows PowerShell 顧慮到安全性,預設是禁止電腦系統執行任何腳本程式,如果要解禁,必須利用 Set-ExecutionPolicy 指令。這個指令有三個參數:

  • set-executionpolicy allsigned:允許執行具有信任簽章的腳本程式。

  • set-executionpolicy remotesigned:僅允許執行從遠端下載且具有信任簽章的腳本程式。

  • set-executionpolicy unrestricted:這是最寬鬆的條件,允許執行任何腳本程式,不管有沒有信任簽章。但自己編寫的腳本程式通常都沒有信任簽章。

善用腳本語言

從近十年的程式語言發展趨勢,能明顯發現腳本語言的發展比系統程式語言更多樣、更活絡,開發者的接受程度也高。當然,這兩種類型的程式語言,各有適用之處,沒有誰取代誰的問題,而是如何選擇適當的方法來完成工作。John K. Ousterhout(Tcl/Tk 的創造者)曾在 Scripting: Higher Level Programming for the 21st Century 一文提出他的看法,他認為腳本語言的主要目的,是在「黏合」(glue)現有的軟體元件,而因為圖形操作介面、網際網路、元件應用框架(component frameworks)的崛起,需要有更多、更好的腳本語言來黏合(因此腳本語言也稱為「黏合語言」(glue languages)或「系統整合語言」(system integration languages)。

當然,腳本語言本身能力的增進,以及電腦硬體的速度越來越快,也都是促進腳本語言蓬勃發展的原因。由於腳本語言大多採用直譯的方式執行,因此執行效能會比利用編譯的系統程式語言慢。不過當電腦硬體的速度越來越快,使用者就漸漸感覺不到腳本語言的速度較慢了。

簡單、易學、易用的腳本語言尤其適合專責系統或網路管理的 IT 人員,因為腳本語言的起源就是為了便利系統操作,而且作業系統的供應者也都會加強這部份的功能,提供更簡易的語法、更豐富的元件,讓 IT 人員更易於「黏合」各項功能,而組合出絕對適合自身需要的腳本程式。

善用 Windows PowerShell

Windows PowerShell 將 Windows 環境各自分離的腳本語言(WSH)和操作指令重新緊密黏合,並且讓 Windows 擁有與 UNIX 旗鼓相當的 shell 環境和腳本語言,在在都讓 Windows 更適用於大型、複雜、重要的電腦運算環境。

當然 Windows PowerShell 的特色及優點尚不只本文所提,但只要依照本文,讀者將能下載、安裝並親自嘗試 Windows PowerShell 的功能,尤其 Windows PowerShell 將登錄資料庫視為磁碟機來存取,實在非常適當,也非常簡便,因為機碼、機碼值的結構,便如同目錄、檔案。在你下載、安裝 Windows PowerShell 的同時,也別忘了下載官方相關文件,裡面有最新的 Windows PowerShell 官方文件。

參考資料及網路資源