Windows PowerShell 講座 (2)—自訂工作環境

發佈日期: 2007 年 12 月 17 日

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

Windows PowerShell 是個相當彈性並且允許管理者自訂的環境,從指令的名稱、執行環境的字型或前背景顏色、輸出的方式或格式,都可以讓管理者充分自行調整;在本文,我們即將討論這些細節。

本頁內容

別名
新增、更改別名
別名的匯出與匯入
管線
過濾輸出
格式化
自訂 Windows PowerShell 的執行環境
另一種 Windows PowerShell 說明文件
總結
相關連結

別名

我們在上一篇文章《Windows PowerShell 講座 (1)—指令、重導、別名》曾約略提過 Windows PowerShell 的別名:您可以在 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,則可以讓您更快的開始使用新環境。

新增、更改別名

而藉由 New-Alias(或其別名 nal)這個 cmdlet,Windows PowerShell 還允許您自行新增別名,不過在新增別名之前,應該先以 gal(也就是 get-alias 的別名)檢查您欲建立的別名是否已經存在:

gal <欲建立的別名>

如果不存在,就可以利用 nal 新增別名,例如以 alias 作為 New-Alias 的別名:

nal alias new-alias

建立之後,我們可以利用 gal 來檢查別名是否建立:

gal alias

如果已經正確建立,gal 就會列出對應的 cmdlet 名稱。除了 nal,Set-Alias(或其別名 sal)也可以用來建立別名,而 sal 還比 nal 多了一項功能,也就是更改別名。例如上述將 alias 新增為 new-alias 的別名之後,我們可以利用 sal 將 alias 更改成 set-alias 的別名:

sal alias set-alias

別名不只可以指向 cmdlet,我們也可以替函式或外部程式建立別名,例如以下就替 Notepad 程式建立 np 別名:

sal np c:\windows\notepad.exe

建立別名還有兩點要注意,首先是別名的建立不能包含參數,例如以下 Set-Location 不能包含參數 C:\:

sal go2c "Set-Location C:\"

再者,建立的別名只在目前的 Windows PowerShell 階段有效(因此可稱為臨時別名),例如上述開啟 Windows PowerShell 之後建立的 alias,在關閉其 Windows PowerShell 視窗之後即失效(再另開 Windows PowerShell 視窗並無此別名)。若要建立永久的別名,要將別名的設定加入 Windows PowerShell 的設定檔(稍後即將說明)。

別名的匯出與匯入

自訂的臨時別名雖然只在自訂的 Windows PowerShell 階段有效,但除了將 Windows PowerShell 別名加入 Windows PowerShell 的設定檔之外,我們也可以利用匯入別名的方式,快速的新增大量的別名。我們可以利用 Export-Alias(或其別名 epal),將目前 Windows PowerShell 階段的別名匯出到檔案 alias.txt:

epal alias.txt

所匯出的別名包含定義在設定檔的永久別名,因此建議您以文字編輯器編輯別名匯出檔,只留下自己定義的別名即可。而我們除了可以檢視、編輯所定義的別名,更重要的是可以利用 Import-Alias(或其別名 ipal),將匯入檔案裡的別名:

ipal alias.txt

由於匯出的別名會包含定義在設定檔的永久別名,因此建議您只留下匯出別名檔裡自己定義的別名(通常在檔案最後面),才不會在匯入時出現一大堆別名已存在的訊息(雖然這些訊息不會影響別名的匯入)。

管線

管線(pipelines)是諸多 shell 都具備的功能,這項功能讓 shell 指令可以相互交換輸出結果,例如包括之前的 Cmd 和 Windows PowerShell,我們都經常利用管線配合 More 來分頁並暫停等待使用者按鍵,以顯示較長的結果:

dir | more

管線搭起了 shell 指令之間的橋樑,如上例,dir 會列出資料夾的內容,more 會將資料分頁並暫停等待使用者按鍵再繼續顯示下一頁資料,而兩者若要配合演出,就需要資料傳遞的機制;管線就是作為這項機制:將 dir 的執行結果傳導給 more,讓 more 以分頁並暫停的方式顯示 dir 所列出的資料夾內容。

過濾輸出

包括 Cmd 在內的多數 shell 管線只能傳遞文字格式的資料,Windows PowerShell 的 cmdlet 所產生的是物件類型的資料,因此 Windows PowerShell 的管線可以傳遞物件。例如想要以 dir 列出檔案大小超過 100 Bytes 的文字檔,可以如下操作:

dir *.txt | where { $_.length –gt 100 }

上述例子有兩個以管線相連的指令,前面的指令是以 dir 列出資料夾裡副檔名為 txt 的檔案,所列出的每個檔案資料都是物件,因此我們要以 where 來過濾 dir 所產生的物件,並且是以管線將dir產生的結果傳遞給 where。where 指令後面的大括號裡面是用來過濾的運算式:由於檔案物件包括了檔案大小、日期、時間等各種屬性,而我們現在要利用檔案大小的屬性($_.length),並且要留下大於 100 bytes 的檔案物件,因此運算式就是上述的{ $_.length –gt 100 } (gt 是大於的意思)。

使用 where 過濾最重要的是找出大括號內的比較運算式,如上可知這個運算式是由三個部分組成:頭尾是參與比較的運算元,中間則是比較運算子,以下是可用於 where 的比較運算式列表(請注意其中有些運算子必須都是小寫,有些則是大寫或小寫均可):

運算子

說明

-eq

相等 (大寫或小寫均可)

-lt

小於(大寫或小寫均可)

-gt

大於(大寫或小寫均可)

-le

小於等於(大寫或小寫均可)

-ge

大於等於(大寫或小寫均可)

-ne

不等於 (大寫或小寫均可)

-not

邏輯運算的反向運算 (亦可以 ! 表示)

-match

使用規則運算式比較字串

-notmatch

使用規則運算式比較字串

-like

使用萬用字元比較字串

-notlike

使用萬用字元比較字串

-replace

替換字串(如果執行替換且傳回True)

-and

邏輯 and 運算

-or

邏輯 or 運算

-bor

位元 OR 運算

-band

位元 AND 運算

-xor

XOR 運算子

-comp

反向運算子 (~)

-sr

向右位移

-sl

向左位移

-ceq

相等 (必須都是小寫)

-clt

小於 (必須都是小寫)

-cgt

大於 (必須都是小寫)

-cle

小於等於 (必須都是小寫)

-cge

大於等於 (必須都是小寫)

-cne

不等於 (必須都是小寫)

-ieq

等於 (大寫或小寫均可)

-ilt

小於 (大寫或小寫均可)

-igt

大於 (大寫或小寫均可)

-ige

大於等於 (大寫或小寫均可)

-ine

不等於 (大寫或小寫均可)

-inot

邏輯運算的反向運算 (大寫或小寫均可)

-imatch

使用規則運算式比較字串 (大寫或小寫均可)

-ilike

使用萬用字元比較字串 (大寫或小寫均可)

-inotlike

使用萬用字元比較字串 (大寫或小寫均可)

格式化

Windows PowerShell 的執行結果幾乎都是文字,因此經常需要將各種長短不一的文字結果編排成容易觀看或閱讀的樣子,所以 Windows PowerShell 本身也提供了文字格式化的功能。例如在上一篇文章《Windows PowerShell 講座 (1)—指令、重導、別名》就曾經提到 get-command,這個 cmdlet 會列出所有 cmdlet 的指令類型(都是 cmdlet)、名稱,以及節錄的語法說明。但如果只是輸入以下指令,其實無法看到所列出 cmdlet 的詳細說明:

get-command

因為 get-command 預設是以表格來顯示結果,而最後一欄可能會因為視窗不夠寬而無法顯示。但我們可以利用管線並搭配 format-list,改以清單顯示 get-command 的輸出結果,就可以看到完整顯示詳細的說明:

get-command | format-list

同樣的,Windows PowerShell 也提供了format-table,可以將輸出結果改以表格的方式呈現,例如 get-wmiobject 預設是以清單顯示系統內的邏輯磁碟:

get-wmiobject -class win32_logicaldisk

而我們可以利用管線並配合 format-table,將輸出結果改以表格的方式呈現:

get-wmiobject -class win32_logicaldisk | format-table

Windows PowerShell 還有許多格式化的指令或功能,例如 format-wide 可以分欄顯示結果,甚至還可以指定欄位的數量;例如以下的例子:

get-command | format-wide				# 分欄顯示(預設為雙欄)
get-command | format-wide -column 3		# 分成三欄顯示

自訂 Windows PowerShell 的執行環境

Windows PowerShell 的執行環境是依附在 Cmd,因此只要更改 Cmd 的外觀,就等於是更改了 Windows PowerShell 的執行環境外觀。自訂的方式就是以滑鼠右鈕按下 Windows PowerShell 捷徑,然後選取快顯功能表裡的『內容』,就可以從內容交談窗來調整 Cmd 的外觀;包括『選項』、『字型』、『版面配置』、『色彩』等標籤頁裡面,都有許多可以用來調整 Cmd 外觀的設定。

除了上述執行環境的外觀,Windows PowerShell 也將執行環境的相關設定放在設定檔(profile)。Windows PowerShell 的設定檔其實就是指令檔,只是檔名和放置的位置較為特別,而可以讓 Windows PowerShell 執行環境啟動之初載入並執行;Windows PowerShell 有以下幾種設定檔:

  • 所有使用者的設定檔:位於 %windir%\system32\WindowsPowerShell\v1.0\profile.ps1

  • 所有使用者的預設設定檔:位於 %windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1

  • 個別使用者的設定檔:位於 %UserProfile%\My Documents\WindowsPowerShell\profile.ps1

  • 個別使用者的預設設定檔:位於 %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Windows PowerShell 安裝之後的原始狀態並不存在上述任何設定檔,不過在建立設定檔之前,應該先在 Windows PowerShell 環境執行以下列指令檢查設定檔是否存在:

test-path $profile

如果執行結果為 False,表示沒有個別使用者的設定檔,可以利用以下指令建立;但如果執行結果為 True,表示系統已經存在個別使用者的設定檔,請跳到下一個編輯設定檔的步驟。請注意,如果設定檔已經存在,卻又以下列指令建立,會清除既有設定檔的內容。

new-item -path $profile -itemtype file -force		# 建立個別使用者的設定檔

接著我們可以在 Windows PowerShell 環境利用 Notepad 來編輯設定檔:

notepad $profile

上述指令會以 Notepad 開啟設定檔,我們可以先將自己慣用的別名設定加入設定檔,此外,我也習慣加入一段便於修改設定檔的函式:

# Windows PowerShell profile added by Goodman Lai
set-alias gh get-help		#新增 get-help 的別名 gh
set-alias np notepad		#新增外部程式 Notepad 的別名 np
function pro {np $profile}		#在命令列輸入 pro 即可開啟 Notepad 修改設定檔的函式

完成輸入之後請記得存檔再關閉 Notepad。我們可以在 Windows PowerShell 利用下列指令得知設定檔的位置及檔名:

$profile

設定檔是在 Windows PowerShell 環境啟動之初載入、執行,因此修改設定檔之後,必須重新開啟 Windows PowerShell,編修過的設定檔才會生效。不過當您關閉再開啟 Windows PowerShell 之後,可能會看到「因為系統已關閉指令檔的執行而無法載入設定檔」的訊息。別擔心,這是正常的情況。基於安全的考量,Windows PowerShell 預設關閉了指令檔的執行功能,而設定檔也是指令檔的一種,因此也無法執行。要開啟 Windows PowerShell 指令檔的執行功能,我們需要 set-executionPolicy,不過您可以先利用 get-executionPolicy 來檢查系統目前的指令檔執行限制:

  • Restricted:預設值,關閉指令檔的執行功能。

  • AllSigned:只允許執行受信任發行者簽署過的指令檔。

  • RemoteSigned:從網際網路下載的指令檔必須經過受信任發行者的簽署才能執行。

  • Unrestricted:任何指令檔皆可執行,但是從網路網路下載的指令檔在執行之前會出現提示交談窗。

為了方便起見,我們將指令檔的執行限制改成 RemoteSigned,也就是自己在本機建立的指令檔不受限制,但限制來自網際網路的指令檔。但要提醒您的是,只要權限足夠的使用者,都有可能自行修改或建立危害系統的設定檔或指令檔。

完成輸入之後請記得存檔再關閉 Notepad。我們可以在 Windows PowerShell 利用下列指令得知設定檔的位置及檔名:

set-executionPolicy RemoteSigned

如果想還原成限制所有指令檔執行的預設狀態,請如下操作:

set-executionPolicy Restricted

更改了指令檔的執行限制之後,請重新開啟 Windows PowerShell,才能載入設定檔。載入之後可以測試設定檔裡才有的功能,例如別名或 pro。

另一種 Windows PowerShell 說明文件

本文的最後將要討論另一種 Windows PowerShell 的獻上說明文件。透過上一篇您一定發現到,以文字模式作為操作介面的 Windows PowerShell,提供了相當好的線上說明功能,不論是在指令後面加上 /?,或者在 get-help 後面加上欲查詢的指令或議題,Windows PowerShell 的線上說明系統都能快速且詳細的列出相關資訊。

不過,或許有些人會因為習慣了超連結的說明文件瀏覽方式,而覺得 Windows PowerShell 的純文字說明系統不是很方便。如果您也有相同的困擾,建議您可以下載微軟另外製作的 CHM 格式的 Windows PowerShell 說明檔。這個說明檔稱為 Windows PowerShell Graphical Help File,其內容包含了 Windows PowerShell cmdlet 和 About 說明、VBScript 轉換到 Windows PowerShell 的指南、Windows PowerShell 手冊、以及每週一密技等四項,其中第一項的內容是與 Windows PowerShell 的純文字線上說明相同。

由於是 chm 的格式,因此這份說明文件不僅編排比純文字線上說明更為美觀,也具備了超連結的瀏覽功能,以及全文搜尋能力。而且不只可以在開啟 Windows PowerShell 視窗的同時,另外開啟這份 chm 文件作為參考,我們也可以在 Windows PowerShell 的命令列模式直接查詢這份 chm 檔案的內容。要達到這些功能,我們要先下載這份 chm 檔案,並且經過適當的設定。

首先我們要下載這份 chm 檔案,Windows PowerShell 1.0 的版本可以在微軟 Windows PowerShell 的網頁或 Windows PowerShell Graphical Help File 的網頁找到下載的連結(目前最新的說明檔版本是 1.1)。解壓縮下載回來的 ZIP 檔,即可找到 PowerShell.chm。接著我們必須在 Windows PowerShell 設定檔加入 get-guihelp 函式,當我們在 Windows PowerShell 文字模式環境輸入 get-guihelp 的時候,這個函式便會顯示 PowerShell.chm 的說明內容。

要注意的是,我們必須將 PowerShell.chm 檔案放置在 get-guihelp 所指定的資料夾(預設是 d:\powershell help\powershell.chm),或者是修改 get-guihelp 裡的檔案位置;如果要修改,請將 get-guihelp 裡的 d:\powershell help\powershell.chm,改成您自己的路徑和檔案名稱,例如我是改成 C:\mshHelp\powershell.chm。改完之後請將設定檔存檔,並且重新開啟 Windows PowerShell 執行環境,然後在 Windows PowerShell 的文字提示符號輸入:get-guihelp,應該就會開啟 PowerShell.chm;或者您也可以直接在 get-guihelp 之後加上您想查詢的指令,這不僅會開啟 PowerShell.chm,而且會直接您所查詢的資料,例如:

get-guihelp set-alias
get-guihelp format-list
get-guihelp about_parsing
get-guihelp InStr
get-guihelp "for each"

如果 get-guihelp 找不到您所查詢的資料(或許是您打錯字、或許本來就沒有這項資料),也還是會開啟 PowerShell.chm,但是 PowerShell.chm 會出現「無法顯示網頁」的訊息。

總結

Windows PowerShell 是個非常靈活、彈性的 shell 作業環境,本文介紹的別名、管線、過濾、格式化等功能,都是 Windows PowerShell 重要且基本的功能,這些功能可以讓我們自訂 Windows PowerShell 的操作指令以及執行結果,而設定檔則是自訂 Windows PowerShell 的重要關鍵,本文亦說明了如何建立、執行設定檔。Windows PowerShell Graphical Help File 是一份豐富且詳細的說明檔案,最為可惜的是目前尚無中文版本。

Windows PowerShell 不只兼容您原本所熟悉的 shell,更創新了許多功能。如果您原本就習慣並經常利用 Cmd 或其他 shell 來操作或管理系統,請直接進入 Windows PowerShell、並且試試原本習慣的指令或作法,或許 Windows PowerShell 能於您原本熟悉的操作方式或指令相容。

相關連結

Windows PowerShell 網頁:http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Windows PowerShell Graphical Help File 網頁: http://www.microsoft.com/technet/scriptcenter/topics/winpsh/pschm.mspx

顯示: