Windows PowerShell 講座 (1)—指令、重導、別名

發佈日期: 2007 年 11 月 1 日

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

Windows PowerShell 是微軟新創的命令列「殼層」和 script 語言,而作為這個系列的第一篇文章,本文除了提及執行環境的建立,也會深入討論指令與參數的使用與編輯,以及重新導向和別名等功能。

本頁內容

安裝 Windows PowerShell 1.0
與 Windows PowerShell 的第一次接觸
Cmdlet 及列出其說明
指令的參數與用法
指令的輸入與編輯
重新導向
別名
總結

Windows PowerShell 可以用在 Windows XP、Windows Vista、Windows Server 2003 和即將於明年推出的 Windows Server 2008(並且也將內建於 Windows Server 2008),而 Exchange Server 2007、System Center Operations Manager 2007、System Center Data Protection Manager V2、System Center Virtual Machine Manager 等軟體也會運用 Windows PowerShell 來強化系統管理。

Windows PowerShell 可以在許多 Windows 系統執行,不過有別於 Windows XP、Windows Server 2003 或 Windows Vista,Windows Server 2008 雖然已經內建了 Windows PowerShell,但尚未安裝。先讓我們說明安裝 Windows PowerShell 的方式。

安裝 Windows PowerShell 1.0

Windows PowerShell 對 Windows Server 2008 來說,是一項『功能』 ,要安裝『功能』,可以利用圖形介面的『伺服器管理員』,或者命令列的 ServerManagerCmd。使用 ServerManagerCmd 最重要的是必須知道『功能』或『角色』的 ID,我們可以先查詢伺服器是否已經裝了 Windows PowerShell,並藉此查得 Windows PowerShell 的 ID;這可以利用 -query 參數:

ServerManagerCmd –query

Dd125489.Winpowerwshell1(zh-tw,TechNet.10).jpg

圖 1

圖 1 是 ServerManagerCmd -query 的執行結果,從中除了可以看出 Windows PowerShell 尚未安裝之外,亦可從得知 ID 是 PowerShell,因此就可以利用下列指令來安裝;執行之後若成功安裝,會出現如

圖 2 的訊息:

ServerManagerCmd -install PowerShell

Dd125489.Winpowerwshell2(zh-tw,TechNet.10).jpg

圖 2

完成安裝之後,就可以在『開始』功能表找到執行 Windows PowerShell 的捷徑(如圖 3),而且『伺服器管理員』也會顯現 Windows PowerShell 功能(如圖 4)。

Dd125489.Winpowerwshell3(zh-tw,TechNet.10).jpg

圖 3

除了命令列的 ServerManagerCmd,圖形模式的『伺服器管理員』也可以安裝 Windows PowerShell 功能,只要按下如圖 4 的『新增功能』:

Dd125489.Winpowerwshell4(zh-tw,TechNet.10).jpg

圖 4

就會出現如圖 5 的『新增功能精靈』,請點選『Windows PowerShell』再按『下一步』按鈕,接著再按下如圖 6 的『安裝』按鈕即可。

Dd125489.Winpowerwshell5(zh-tw,TechNet.10).jpg

圖 5

Dd125489.Winpowerwshell6(zh-tw,TechNet.10).jpg

圖 6

Windows PowerShell 也能在 Windows XP、Windows Vista、Windows Server 2003 執行,但必須先下載套件再安裝,這部分的細節可參考《下載、安裝 Windows PowerShell 1.0》。此外,本文討論的是 Windows PowerShell 1.0,內容不僅適用 Windows Server 2008 內建的 Windows PowerShell 1.0,也適用其他 Windows 版本。

與 Windows PowerShell 的第一次接觸

Windows PowerShell 是內含「script 語言」的 Windows「殼層」環境,這個殼層與 Cmd 命令提示字元關係密切,您可以將 Windows PowerShell 視為 Cmd 命令提示字元的延伸,許多 Cmd(甚至 UNIX 指令)指令都可以繼續在 Windows PowerShell 執行,而且大部分的命令列工具程式也都能繼續在 Windows PowerShell 使用。Windows PowerShell 與 .NET 的關係也相當密切:Windows PowerShell 需要 .NET 2.0 才能執行、Windows PowerShell 的 Cmdlet(等一下會說明)是 .NET 物件,因此綜合前述,您可以將 Windows PowerShell 視為 Cmd 命令提示字元的 .NET 延伸版本。

安裝 Windows PowerShell 之後,只要雙按如圖 3『開始』功能表裡的 Windows PowerShell 捷徑,就可以啟動 Windows PowerShell 環境。我也建議您複製一份 Windows PowerShell 捷徑到桌面、『快速啟動』工具列、或任何您喜好的地方,以便能快速啟動 Windows PowerShell 環境。

雙按 Windows PowerShell 捷徑之後,螢幕上會出現一個看似命令提示字元、但底為藍色的視窗(如圖 7),這就是 Windows PowerShell 的執行環境:您可以在這個視窗輸入指令,並且看到執行結果。

Dd125489.Winpowerwshell7(zh-tw,TechNet.10).jpg

圖 7

剛才提到 Windows PowerShell 可以視為 Cmd 命令提示字元的延伸,許多 Cmd 或 UNIX 指令都可以繼續在 Windows PowerShell 執行,而且大部分的命令列工具程式也都能繼續在 Windows PowerShell 使用;您可以試著在 Windows PowerShell 視窗輸入您所熟悉的 Cmd 指令或命令列工具程式,例如 cd/chdir、dir、cls、ls,或 ipconfig、甚至是剛才提及的 ServerManagerCmd。此外,不只 Windows Scripting Host 程式可以在 Windows PowerShell 執行,在 Windows PowerShell 環境輸入圖形介面程式的執行檔名,也能啟動圖形介面程式。類似 Cmd 環境的是,Windows PowerShell 也不分字母大小寫,因此 dir 和 Dir 都會視為相同的指令。

Cmdlet 及列出其說明

如同其他的殼層,Windows PowerShell 雖然也內建了若干指令,但重要及有用的功能是來自於外加的工具程式。若以 Cmd 來對照說明:Cmd 雖然內建了若干指令(例如 dir、cls 等),但如果無法執行外加的工具程式(例如 IPConfig、Net、NetSH、ServerManagerCmd 等等),Cmd 就失去價值及擴充的能力了。同樣的,Windows PowerShell 也是如此,但不同的是,Windows PowerShell 有自己的工具程式規格,而 Windows PowerShell 的工具程式稱為 cmdlet。

Cmdlet 最大的特徵,就是其名稱是由兩個部分所組成,並以橫線連結這兩個部分:前為動作、後為動作的標的;例如 Get-Help 能取得線上說明、Get-Process 能取得行程資訊。Windows PowerShell 1.0 提供了 129 個 cmdlet,而且也提供了一個可以列出所有 cmdlet 的 cmdlet:Get-Command,這個 cmdlet 會列出所有 cmdlet 的指令類型(都是 Cmdlet)、名稱,以及節錄的語法說明;如果要完整顯示語法說明,需要利用管線的技巧(管線是後續文章的主題,現在暫不說明細節):

Get-Command | Format-List

如果想要知道某個 cmdlet 的使用說明,利用 Get-Help cmdlet 以及以下 3 種方法,都可以達到相同的目的:

  • Get-Help <cmdlet 名稱>

  • Help <cmdlet 名稱>

  • <cmdlet 名稱> -?

以上第 3 種方式最方便,但前兩種還可用來顯示「概念主題」(所有概念主題都是以 about 開頭),例如以下指令會列出 foreach 陳述式的說明(可用在 script 程式):

Help about_foreach

Get-Help(或 Help)還可以透過萬用字元列出相關主題,例如:

Get-Help *			→列出所有說明主題
Get-Help set-*			→列出所有 set- 開頭的主題
Get-Help *object*			→列出所有名稱裡有 object 的主題
Get-Help about*			→列出所有概念主題
Get-Help about_redirection		→列出『重新導向』概念主題的說明內容

Get-Help 和 Help 也不是全然相同,例如 Get-Help 會一次顯示完所有的說明,因此如果要顯示的內容多過視窗所能呈現,您就得以捲動軸往回捲動,才能看到說明內容;而如果內容超過視窗所能呈現,Help 會在顯示滿一個視窗範圍後便自動暫停,等到使用者按下空白鍵才會顯示下一頁,或者以 Enter 鍵顯示下一行。

前述 3 種方法所列出的是 cmdlet 的簡略說明,有些主題或 cmdlet 還可以利用 Get-Help/Help 的 -detailed 或 -full 參數,列出包含範例的詳細或所有說明,而 -examples 參數則可以列出範例;例如:

Get-Help Get-Help -detailed		→列出 Get-Help 的詳細說明
Help dir -full			→列出 dir 的完整說明
Help dir -examples			→僅列出 dir 的範例

指令的參數與用法

除了 cmdlet,Windows PowerShell 的指令還包括別名、函式、程式、script 檔案,輸入指令的同時,有時候必須輸入適當的參數。不同類型的指令,其參數的格式亦略有差異。對 Cmdlet 及別名來說,有些參數包含成對的參數名稱及參數值,有些參數則只有參數名稱或參數值,而參數名稱是以短橫線作為前置符號;例如以下的 -name dir 就是成對的參數名稱(-name)和參數值(dir),-examples 則沒有參數值:

Get-Help -name dir -examples

指令的參數分成必要參數和可以省略的選用參數兩類,查詢指令用法的說明會以一對半形的方括號括住選用參數,必要參數則不會有符號括住;以方括號括住表示可以省略。例如 Get-Help 的用法(節錄):

Get-Help [[-name] <string>]
[-component <string[]>] 
[-functionality <string[]>] 
[-role <string[]>] 
[-category <string[]>] 
[-examples] 
[<CommonParameters>]

查詢指令的用法時,經常會看到以上用法說明,其中:

  • 一共有 7 個選用參數,並沒有必要參數(因為這7個參數都以方括號括住)。

  • 前 5 個參數包含了成對的參數名稱和參數值。

  • 前 5 個參數包含了成對的參數名稱和參數值。

  • [<CommonParameters>] 參數只有參數值;這個參數意指每個 cmdlet 都支援的共同參數。

  • 第 1 個參數的參數名稱也以方括號括住,表示這個參數名稱可以省略,所以我們可以只輸入 Get-Help dir。

  • 第 1 個參數的參數值是 <string>,表示這個參數值為字串;以角括號括住,表示必須輸入適當的參數值,而不是輸入 string。

使用 cmdlet 經常要輸入許多參數名稱,為了能少按一些按鍵,Windows PowerShell 提供了一套 cmdlet 的參數名稱簡略輸入法則:

  • 可以盡可能的取其參數名稱的前面最短字母來代表參數名稱

  • 如果與同一 cmdlet 的其他參數名稱混淆,就要多取字母,直到不會混淆為止(但如果繼續多取字母,也可以執行)

  • 橫線前置符號不能省略

我們以實例來說明參數名稱的簡略輸入法則,例如以下的指令:

Get-Help -name dir -examples

上述指令經過 cmdlet 的參數名稱簡略輸入法則可以變成:

Get-Help -n dir –ex
或
Get-Help -nam dir -exa
  • -name 不會與其他參數名稱混淆的最簡略形式為 -n;但實際上整個 -name 均可省略,簡略成 -n 只是為了說明這套法則。

  • -examples 不能簡略成 -e,因為這會與 -ErrorAction、-ErrorVariable(這些是 cmdlet 的共同參數)混淆,因此至少要再多取 e 之後的一個字母,才不會混淆。同樣的 Get-Help,-ErrorAction、-ErrorVariable 要如何輸入才能最簡略呢?答案是 -ErrorA、-ErrorV。

指令的輸入與編輯

為了簡化指令的輸入,Windows PowerShell 也提供了相當方便且實用的指令輸入輔助功能。藉由這些功能,您可以重複執行過的指令,而不需要重新輸入;或者也可以取出執行過的指令,進而編修再執行。當您開啟 Windows PowerShell 之後,您在 Windows PowerShell 視窗所輸入過的所有指令都會被記錄下來(稱為「歷程」),而 Windows PowerShell 也提供了許多快速鍵,讓您快速取得曾經輸入過的指令,減少指令輸入的工作。不過一旦您結束 Windows PowerShell,Windows PowerShell 的歷程也因沒有存檔而消失了,也就是說,歷程的有效期限僅止於 Windows PowerShell 的執行階段。

這些快速鍵包括了上下左右方向鍵、功能鍵、以及一些組合鍵,要提醒您的是,這些快速鍵必須在 Windows PowerShell 歷程記錄了您所輸入的指令才有作用,而且當您以這些快速鍵取回並執行歷程裡的指令之後,再次執行的指令也會被歷程所記錄。您可以將指令歷程想像成「0 起始的一維陣列」,每次輸入執行的指令,會加到陣列之後,而這個陣列有一個指標指向最近執行的指令,利用方向鍵就可以移動指標,並將指標指向的指令顯示在提示字元,這時只要按下 Enter 鍵,就可以直接執行。

我們假設歷程已經依序記錄了以下的指令,並以此例來說明這些快速鍵的用法:

0. Get-Help *
1. Help dir -full
2. Help dir -examples
3. dir d:\folder1 > folder.txt
4. dir d:\folder2 >> folder.txt
5. Get-Help about* > msh-aboutTopics.txt
6. Get-Process
7. Get-Process -name "explorer"
8. cd c:\windows\system32
9. dir vb*.dll

↑ 方向鍵

按一次 ↑ 方向鍵,會在提示字元顯示最近執行過的指令;實際上,按一次 ↑ 方向鍵會將歷程的指標往回移動一個指令,並將指令顯示在提示字元。如果最近輸入執行的是上述第 10 個指令,按一次 ↑ 方向鍵會在提示字元顯示第 10 個指令;如果最近執行的是上述第 6 個指令,那麼按兩次 ↑ 方向鍵之後,提示字元會顯示第 6 個指令。

↓ 方向鍵

與 ↑ 方向鍵相反,按一次 ↓ 方向鍵會將歷程的指標往前移動一個指令,並將指令顯示在提示字元。

PgUp 鍵

會將歷程的指標往前移到第1個指令,並將指令顯示在提示字元。

PgDn 鍵

會將歷程的指標往前移到最後一個指令,並將指令顯示在提示字元。

→ 方向鍵

如果游標右側沒有字元,按一次會顯示目前指標所指指令的一個字元,並將游標往右移動,直到顯示完指令所有的字元,就無法再移動游標;如果游標右側有字元,就只會向右移動游標。舉例來說,假設現在歷程指標指向第 6 個指令,但提示字元空無一物,這時按 5 次 → 方向鍵,會依序顯示 G、e、t、-、P。

← 方向鍵

將游標往左移動,可以用來編輯指令。呈上例,游標在 P 的右側,按 ← 方向鍵 3 次,游標會移到 t;這時若再按 → 方向鍵兩次,游標會移到 P。

Home 鍵

將游標移到提示字元指令的開頭。

End 鍵

將游標移到提示字元指令的結尾(最後一個字元之後)。

Ctrl + → 方向鍵

向右移動提示字元指令的游標,但一次移動一個字(而非字元)。

Ctrl + ← 方向鍵

向左移動提示字元指令的游標,但一次移動一個字(而非字元)。

Ctrl + C

取消目前的指令,並出現新的空白提示字元。

F2 功能鍵

能將您最近的指令複製到提示字元,並且可以根據您的指示來決定要複製多少字元。舉例來說,假設最近的指令是上述第 7 個,且提示字元空無一物,若按下 F2 功能鍵,視窗正中央會出現『輸入複製字元』的訊息,此時若按下 "(雙引號),提示字元會顯示 Get-Process -name(最後一個 e 之後還有一個空白字元,游標會在空白字元之後);也就是說,會將您所輸入字元之前的所有字元,都複製到提示字元的指令行。同樣的例子,如果您輸入 e,則只會複製 G。按下 F2 功能鍵之後,可按下 Enter 鍵取消這項功能。

F3 功能鍵

顯示最近一次執行過的指令。

F4 功能鍵

能刪除提示字元指令行裡指定的字元。這個功能鍵的用法和 F2 功能鍵有些類似,假設提示字元裡的指令是上述第 7 個,而且我們利用 ← 方向鍵將游標移到 c,此時按下 F4 功能鍵,視窗正中央會出現『輸入刪除字元』的訊息,這時候如果按下 -(橫線),那麼從 c 到橫線之前的字元都會被刪除,也就是說,指令的變化如下:

Get-Process –name "explorer"
變成
Get-Pro-name "explorer"

F4 功能鍵有一項使用技巧:如果想刪除游標之後所有的字元,可以直接按下 Enter 鍵。

F5 功能鍵

功能如同 ↑ 方向鍵。

F7 功能鍵

如果不喜歡盲目的按著 ↑、↓ 方向鍵來找尋指令,可以利用按下 F7 功能鍵所出現的列示窗(如圖 8),這個列示窗顯示了歷程裡的指令及其輸入順序的編號。您可以利用 ↑、↓ 方向鍵來選取列示窗裡的指令(猶如指向指令的指標),再按下 Enter 鍵即可執行選取的指令(並且也會關閉列示窗);或者按下 ←(或 →)方向鍵,可以在提示字元顯示所選取的指令,您可進而編修指令再按 Enter 鍵執行。若要關閉列示窗,可以按下 Esc 鍵。

Dd125489.Winpowerwshell8(zh-tw,TechNet.10).jpg

圖 8

F8 功能鍵

如果提示字元空無一物,按下 F8 功能鍵會讓歷程指標往回指向上一個指令,並將指令顯示在提示字元。如果提示字元輸入了部分指令,情況又有點不同,讓我們以實例說明。假設現在歷程指標指向第 8 個指令,並且在提示字元輸入 dir,然後按下 F8 功能鍵,提示字元會顯示第 4 個指令,因為第 4 個指令是距離原本指標(第 8 個指令)最近的上一個有 dir 的指令;若再按 F8 功能鍵,會再顯示上一個有 dir 的指令,並繼續循環。

F9 功能鍵

按下 F9 功能鍵之後,視窗正中央會出現讓您輸入指令編號的交談窗(如圖 9),輸入編號並按下 Enter 鍵,該編號的指令會出現在提示字元,您可進而編修指令再按 Enter 鍵執行。。若要關閉交談窗,可以按下 Esc 鍵。

Dd125489.Winpowerwshell9(zh-tw,TechNet.10).jpg

圖 9

重新導向

如同 Cmd(以及其他許多殼層),Windows PowerShell 預設也是將執行結果顯示在視窗,例如前述許多範例就是如此。但有時或許因為執行結果較多、較長,顯示在視窗並不容易檢閱,也或許想要保留執行結果,如果有這種情形,可以利用 cmdlet 的重新導向功能,將執行結果「重導」到指定的文字檔。

重新導向必須利用重新導向運算子 >,並且也要指定完整的檔名,例如我們可以利用下列方式,將列出的所有概念主題重新導向 msh-aboutTopics.txt 文字檔:

Get-Help about* > msh-aboutTopics.txt

cmdlet 加了重新導向運算子,Windows PowerShell 視窗就不會顯示執行結果。為了方便能以文字編輯器開啟,應該替檔名加上諸如 .txt 之類的副檔名,而如果指定的檔案名稱並不存在,Windows PowerShell 會自行建立,但如果指定的檔案名稱已存在,以上的例子則會覆蓋舊檔案的內容。此外,以上的例子並沒有指定檔案的路徑,因此會在目前的工作路徑建立 msh-aboutTopics.txt 文字檔。

有時候您並不希望檔案內容被重新導向覆蓋,這種情形可以改用另一種重新導向運算子 >>:

dir d:\folder1 > folder.txt		→ 第 1 次重新導向,建立新的檔案
dir d:\folder2 >> folder.txt	→ 第 2 次重新導向,內容會附加到檔案

上述例子的第 1 次重新導向會將 folder1 資料夾的內容加入新建立的檔案 folder.txt;如果 folder.txt 檔案已存在,重導的內容會覆蓋 folder.txt 檔案原本的內容。第2次重新導向會將 folder2 資料夾的內容附加到 folder.txt 第 1 次加入的內容之後,不會覆蓋原本的內容。

別名

您可以在 Windows PowerShell 繼續使用原本熟悉的 Cmd 指令,但是這些指令實際上都有相對應的 cmdlet,也就是說,這些指令是某些 cmdlet 的別名(alias),例如 cd 和 chdir 指令是 Set-Location cmdlet 的別名,而 dir 指令是 Get-ChildItem cmdlet 的別名。

Windows PowerShell 的 Get-Alias cmdlet 可以列出目前所有的別名,甚至 Get-Alias 本身也有別名,那就是 gal。別名的好處之一,是能以縮寫來替代原本較為冗長的 cmdlet 名稱(例如以 gal 替代 Get-Alias);此外,利用別名將其他殼層的指令對應到 Windows PowerShell cmdlet,則可以讓您更快的開始使用新環境。Windows PowerShell 還允許您自行定義別名,這留待後續的文章另行說明。

總結

Windows PowerShell 是微軟為 Windows 新創的殼層,這個殼層也包含 script 語言。相較於原本的 Cmd 和 WSH,Windows PowerShell 結合了殼層與 script 語言,並且也融合了 .NET 技術。「全面的一致性」是 Windows PowerShell 的優點之一,舉凡指令及參數的用法、取得說明的方式,都比 Cmd 有更好的一致性,這能 Windows PowerShell 更容易學會,也更容易使用。

Windows PowerShell 的執行環境也提供了方便且實用的指令輸入功能,藉由這些功能,您更能重複使用執行過的指令,或者取回執行過的指令並進一步編修而再執行。重新導向和別名也是許多殼層都具備的功能,前者能更彈性的運用執行結果,而後者能讓您以原本熟悉或易記的指令名稱來取代新的、冗長(但符合一致性)的指令。

相較於 Cmd 和 WSH,Windows PowerShell 的另一項優勢,是 Windows PowerShell 正持續不斷的發展;雖然 Cmd 和 WSH 目前的使用者較多、雖然 Windows PowerShell 不會於此刻馬上取代 Cmd 和 WSH,但是您總得為明天預作準備。

參考資料

1根據台灣微軟所釋出的 Windows Server 2008 RC0 的繁體中文版,許多如 Server Manager、Feature 等術語,也有了『伺服器管理員』、『功能』等官方的正式中文名稱,因此本文及後續文章將會改用官方的中文名稱(例如之前文章所謂的『特徵』,在後續文章就會改用『功能』)。

顯示: