重劍點(diǎn)評:這玩意兒有啥用呢? 遠(yuǎn)期目標(biāo):給版本制作組提供更方便更強(qiáng)大更自動化的腳本; 近期目標(biāo):耍酷!嘿嘿,用下這個: ipconfig | findstr "Address"
下面是例子的鏈接:
Windows PowerShell Scripts
Windows PowerShell 是微軟為 Windows 環(huán)境所開發(fā)的 shell
及腳本語言技術(shù),這項(xiàng)全新的技術(shù)提供了豐富的控制與自動化的系統(tǒng)管理能力;而“腳本語言”(scripting
languages)則是用來編寫程序的計算機(jī)語言。腳本語言通常都有簡單、易學(xué)、易用的特性,目的就是希望能讓寫程序的人(開發(fā)者)快速完成程序的編寫
工作。本文將簡述腳本語言的起源與目的,并且介紹 Windows PowerShell。
腳本語言的源起與目的
腳本語言是計算機(jī)程序語言(programming
languages)的一種,因此也能讓開發(fā)者藉以編寫出讓計算機(jī)聽命行事的程序。但是「以簡單的方式快速完成某些復(fù)雜的事情」通常是創(chuàng)造腳本語言的重要
原則,基于這項(xiàng)原則,使得腳本語言通常比 C、C++ 或 Java 之類的「系統(tǒng)程序語言」(system programming
languages)「簡單」、「容易」,也讓腳本語言另有一些所謂「腳本語言的特性」: •
語法和結(jié)構(gòu)通常比較簡單 •
學(xué)習(xí)和使用通常比較簡單 •
通常以容易修改程序的「直譯」作為執(zhí)行方式,而不需要編譯 •
程序的開發(fā)產(chǎn)能優(yōu)于執(zhí)行效能
腳本語言源自早期文字模式的命令列計算機(jī)系統(tǒng),在當(dāng)時只能以鍵盤敲入命令才能操作計算機(jī)的情況下,為了減少某些需要不斷重復(fù)敲入命令的情
況,計算機(jī)操作系統(tǒng)的命令處理器(在 UNIX 的世界這通常稱為 command shell)提供了「批次操作」(batch
operation)的方式,讓計算機(jī)操作者可以將一整個流程的命令,循序、逐行的編排在稱為「批處理」(batch file,也稱為 batch
jobs 或 shell scripts)的文字文件,若有相同的操作需要處理,即可加載批次檔而不需再次重復(fù)敲入指令。
Shell Script
由于批處理對命令列的計算機(jī)系統(tǒng)操作者幫助甚大,因此操作系統(tǒng)的命令處理器也不斷加強(qiáng)功能,尤其加入了許多程序語言的重要元素,包括變量、
循環(huán)、條件判斷等等,讓計算機(jī)操作不只是循序的執(zhí)行命令,而能更精確的操控計算機(jī)系統(tǒng)的運(yùn)作;這種程序設(shè)計通常稱為 shell
programming。因此,不論是大型主機(jī)的系統(tǒng)操作員,或者是整個計算機(jī)環(huán)境的系統(tǒng)管理員、網(wǎng)絡(luò)管理員,shell programming
都是相當(dāng)重要的技能,這項(xiàng)技能可以有效且快速的管理轄下的計算機(jī)。
UNIX 系統(tǒng)的 shell 相當(dāng)多樣,例如 Bourne Shell(sh)、Bourne-Again Shell(bash)、Korn Shell(ksh)、C Shell(csh)等等;以下簡述常見的 UNIXshell。 •
Bourne Shell(sh):這是歷史悠久且重要的 UNIX shell,是由貝爾實(shí)驗(yàn)室的研究員 Stephen Bourne 為第七版的 UNIX 所創(chuàng)造,這種 shell 的執(zhí)行檔擴(kuò)展名就是 .sh。 •
Bourne-Again Shell(bash):光從名稱就能猜出 bash 與 sh 是有淵源(甚至說「血緣」)。bash
是由 Brian Fox 于 1987 年為 GNU 所創(chuàng)造,1990 年起,Chet Ramey 成為主要的維護(hù)者。bash 是相當(dāng)流行的
shell,除了是大多數(shù) Linux 預(yù)設(shè)的 shell,在許多 UNIX-like 系統(tǒng)也有其蹤跡(例如 Mac OS X
Tiger),甚至也能通過 Cygwin 在 Windows 系統(tǒng)執(zhí)行。
•
Korn Shell(ksh):是由貝爾實(shí)驗(yàn)室的研究員 David Korn 在 80 年代初期所創(chuàng)造,ksh 除了與 sh 完全兼容,也包含了若干 C Shell 的功能。
•
C Shell(csh):是由 Bill Joy(后來創(chuàng)辦了Sun公司)為 BSD UNIX 系統(tǒng)所創(chuàng)造。csh 源自于第六版 UNIX 的 Thompson shell(是 Bourne Shell 的前身),因?yàn)檎Z法類似 C 語言而得名。
除了上述盛行于 UNIX 環(huán)境的 shell,其它操作系統(tǒng)也有專屬的 shell 或 shell 腳本語言,例如蘋果Mac系統(tǒng)的
AppleScript、IBM OS/2 的 REXX(REstructured eXtended eXecutor)。而 DOS 以及早期
Windows 的 shell 則是 Command.com,但也因功能較弱,因此有 4DOS、4NT 等軟件可增強(qiáng)功能,Windows
2000 以及之后的 Windows 則改以功能較強(qiáng) cmd.exe 作為 Windows shell,并且以 Windows Script
Host 作為腳本語言執(zhí)行環(huán)境,大幅提高了 Windows shell 的可用性。而微軟也將會推出功能更強(qiáng)的 Windows shell,稱為
Windows PowerShell。
雖然現(xiàn)在許多計算機(jī)系統(tǒng)都提供了圖形化的操作方式,但是卻都沒有因而停止提供文字模式的命令列操作方式,相反的,許多系統(tǒng)反而更加強(qiáng)這
部份的功能,例如 Windows 就不只加強(qiáng)了操作命令的功能和數(shù)量,也一直在改善 shell programming
的方式。而之所以要加強(qiáng)、改善,當(dāng)然是因?yàn)椴粔蚝茫籛indows
的圖形化操作方式對單一客戶端計算機(jī)的操作,已經(jīng)相當(dāng)方便,但如果是一群客戶端計算機(jī),或者是 24
小時運(yùn)作的服務(wù)器計算機(jī),圖形化操作方式有時會很不方便。
宏語言
宏語言也可視為腳本語言的分支,兩者也實(shí)質(zhì)上的相同之處。宏語言通常附屬于某一種軟件,例如微軟 Office、Visual
Studio、Adobe Photoshop 都內(nèi)建了宏語言的功能,使用者可利用軟件所附的宏語言,達(dá)到自動化的結(jié)果(例如調(diào)整某個數(shù)據(jù)夾所有
PSD 圖文件的分辨率)。而這類宏語言也大多提供錄制宏的功能,自動記錄使用者的鍵盤按鍵,讓使用者不必寫程序,就能產(chǎn)生宏程序。此外,C
語言和匯編語言也有宏功能,是以搜尋及取代進(jìn)行編譯或組譯之前的前置處理。
Windows PowerShell 誕生
UNIX 的世界有功能強(qiáng)大的 shell,現(xiàn)在 Windows 環(huán)境也有了;Windows PowerShell
不僅提供功能相當(dāng)于BASH的命令列 shell,同時也內(nèi)建腳本語言以及輔助腳本程序的工具。Windows PowerShell 是以 .NET
技術(shù)為基礎(chǔ),并且與現(xiàn)有的 WSH 保持回溯兼容,因此 Windows PowerShell 的腳本程序不僅能存取 .NET
CLR,也能使用現(xiàn)有的 COM 技術(shù)。
Windows PowerShell
包含了數(shù)種系統(tǒng)管理工具、簡易且一致的語法,提升管理者處理常見如登錄數(shù)據(jù)庫、WMI。Exchange Server 2007 以及 System
Center Operations Manager 2007 等服務(wù)器軟件都將內(nèi)建 Windows PowerShell。
Monad 是 Windows PowerShell 之前的項(xiàng)目代號,Microsoft Shell(MSH)則是另一個別名;簡而言之,Windows PowerShell 具有以下特點(diǎn):
一致性的設(shè)計讓所有工具和系統(tǒng)數(shù)據(jù)的使用語法、命名原則都相同。
Windows PowerShell 的腳本語言不僅簡單易學(xué),而且能支持現(xiàn)有的腳本程序和命令列工具。 •
內(nèi)含 129 種稱為 cmdlet 的標(biāo)準(zhǔn)工具,可用來處理常見的系統(tǒng)管理工作,例如登錄數(shù)據(jù)庫、系統(tǒng)服務(wù)、形成、WMI、事件日志等等。 •
具備完整的擴(kuò)充功能,獨(dú)立軟件商或開發(fā)者都能很容易的自行擴(kuò)充。
下載、安裝、執(zhí)行 Windows PowerShell
Windows PowerShell 可安裝于 Windows XP 以及之后的客戶端或服務(wù)器端 Windows 操作系統(tǒng),包括: •
客戶端:Windows XP、Windows XP Service Pack 1、Windows XP Service Pack 2、Windows Vista •
服務(wù)端:Windows Server 2003、Windows Server 2003 R2、Windows Server 2003 Service Pack 1
而 Windows PowerShell 除了有 32 位版本,也還有 x64 和 ia64 等兩個 64
位版本,可以安裝在這兩種 64 位 Windows 平臺。此外,由于執(zhí)行 Windows PowerShell 需要 .NET
Framework 2.0,因此請先替計算機(jī)安裝 .NET Framework 2.0。
安裝之后,可以利用以下三種方式執(zhí)行 Windows PowerShell:
位于『開始 / 所有程序』的『Windows PowerShell』快捷方式。
在『開始 / 運(yùn)行』的『運(yùn)行』命令窗輸入 powershell。
在任何『命令提示字符』窗口的命令提示符號輸入 powershell。
Windows PowerShell 窗口看起來類似原本的『命令提示字符』窗口,而我通常也都會調(diào)整窗口和字型的大小,以方便作業(yè)。
初探 Windows PowerShell
任何 shell 都有列出目錄、文件的命令,Windows PowerShell 呢?先輸入 DOS 的 dir 試試吧!

圖 1 dir 指令執(zhí)行結(jié)果
嗯!dir 果然也通,但是列示的方式不同于以往的 dir 指令。一時興起,我輸入了 UNIX 的 ls 指令,窗口顯示了與 dir 指令相同的結(jié)果;真有趣(這時候我尚未閱讀任何 Windows PowerShell 文件,只是很直覺輸入指令)。
Windows PowerShell 指令
cmdlet 是 Windows PowerShell 的指令,這相當(dāng)于 DOS 或其它 shell 的內(nèi)建指令(但是剛剛輸入的
dir 或 ls 并不是 cmdlet,這稍后將會說明),cmdlet 的發(fā)音方式是 command-let。cmdlet
名稱的格式都是以連字符號隔開的一對動詞和名詞,并且通常都是單數(shù)名詞。例如可以在線查詢 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 循環(huán)。
get-help get*:列出所有 get 開頭的主題。 •
get-help {<指令名稱或主題名稱>}:列出指定的指令或主題的說明,例如 get-help dir 可以查詢 dir 指令的用法,而 get-help about_wildcard 可以查詢「萬用字符」這項(xiàng)主題的用法。
此外,也可以用 help 取代 get-help,最大的好處是 help 顯示滿整個窗口,預(yù)設(shè)就會自動暫停。
一開始曾經(jīng)使用了 dir 和 ls,雖然這并不是 cmdlet,但的確可用于 Windows
PowerShell。原來這類的指令稱為 alias(化名),類似 cmdlet 的快捷方式,例如 dir 和 ls 實(shí)際上都是
get-ChildItem 的 alias,get-ChildItem 才是 cmdlet;而 get-ChildItem
的功能,是列出磁盤驅(qū)動器指定位置的子項(xiàng)目。
Windows PowerShell 的指令包含了許多內(nèi)建的 alias,這些 alias 都是我們原本熟悉的 DOS 或
shell 指令,除了上述的 dir 和 ls,例如原本 DOS 指令的 rm、rmdir、rd、cls、copy 等,以及 BASH 的
cat、sleep、clear、cp 等,都是 Windows PowerShell 的 alias,也就是說,可以直接使用這些
alias;若要列出所有的 alias,可以用 get-alias 指令。除了使用內(nèi)建的 alias,Windows PowerShell
也允許使用者以 set-alias 建立自己的 alias。
除了 cmdlet 和 alias,Windows PowerShell 的指令還有 Application 和
Function 兩種類型,前者指的是獨(dú)立的程序文件(在 DOS 時代稱為外部指令),后者是有名稱的程序代碼區(qū)塊,也就是函式:不論
Application 或 Function 都可以當(dāng)作 Windows PowerShell 指令來用,也可以用在腳本程序里。利用
get-command *,可以列出所有的指令。
Windows PowerShell 的管線功能
DOS 或 UNIX shell 都能利用「管線符號」(pipeline
symbol),將指令的執(zhí)行結(jié)果移轉(zhuǎn)到另一個指令,讓另一個指令處理前一個指令轉(zhuǎn)來的數(shù)據(jù)。Windows PowerShell 的管線符號也是
|,例如之前用過的 get-help * | more,就是將 get-help * 的結(jié)果轉(zhuǎn)給 more,而 more
會讓結(jié)果顯示滿整個窗口就暫停。
管線是各種 shell 環(huán)境的「黏合」最佳例證,例如管線就黏合了 Windows PowerShell 的各個指令,進(jìn)而讓各個指令完成一件工作。再舉幾個管線的例子。首先是:
ipconfig | findstr "Address"
被管線黏合的 ipconfig 和 findstr 都是 Win32 既有的外部指令,前者會顯示、設(shè)定計算機(jī)的 IP
地址,后者則能以各種方式找出特定字符串。以上的敘述是將 ipconfig 的執(zhí)行結(jié)果轉(zhuǎn)給 findstr,并讓 findstr 找出執(zhí)行結(jié)果的
Address 字符串。
圖 2 ipconfig | findstr "Address"執(zhí)行結(jié)果
再舉兩個例子。以下的敘述會列出已停止的系統(tǒng)服務(wù),但是由 get-service 和 where-object 相互協(xié)力完成,前者列出所有的系統(tǒng)服務(wù),后者過濾出狀態(tài)為 Stopped 的系統(tǒng)服務(wù):
get-service | where-object {$_.Status -eq "Stopped"}
但以上敘述的結(jié)果會以系統(tǒng)服務(wù)的名稱作為排列方式,若想以系統(tǒng)服務(wù)的「顯示名稱」依序排列,可以再加上 sort-object,并也以管線黏合:
get-service | where-object {$_.Status -eq "Stopped"} | sort-object -property DisplayName

圖 3 三重管線范例的執(zhí)行結(jié)果
新的腳本語言
微軟為 Windows PowerShell 創(chuàng)造了新的腳本語言,但若你熟悉任何一種腳本語言,你也能很快熟悉 Windows
PowerShell 的腳本語言。基本上,只要將 Windows PowerShell 的指令放進(jìn)擴(kuò)展名為 .ps1 的文字文件,這個文件就是
Windows PowerShell 的腳本程序了。因此在熟悉了 Windows PowerShell 的命令操作之后,只要再熟悉
Windows PowerShell 腳本語言的變量、數(shù)組、循環(huán)控制、條件控制,大致上就語言的部分就差不多。但若要以腳本程序管理
Windows 系統(tǒng),除了要熟悉腳本語言,當(dāng)然也必須熟悉 Windows PowerShell 指令和
WMI,畢竟腳本語言的目的只是黏合這些現(xiàn)成的軟件組件。
執(zhí)行腳本程序還有幾點(diǎn)注意事項(xiàng),首先要確定腳本程序所在的位置是在執(zhí)行路徑里。再者,由于 Windows PowerShell
顧慮到安全性,預(yù)設(shè)是禁止計算機(jī)系統(tǒng)執(zhí)行任何腳本程序,如果要解禁,必須利用 Set-ExecutionPolicy 指令。這個指令有三個參數(shù):
set-executionpolicy allsigned:允許執(zhí)行具有信任簽章的腳本程序。 •
set-executionpolicy remotesigned:僅允許執(zhí)行從遠(yuǎn)程下載且具有信任簽章的腳本程序。 •
set-executionpolicy unrestricted:這是最寬松的條件,允許執(zhí)行任何腳本程序,不管有沒有信任簽章。但自己編寫的腳本程序通常都沒有信任簽章。
善用腳本語言
從近十年的程序語言發(fā)展趨勢,能明顯發(fā)現(xiàn)腳本語言的發(fā)展比系統(tǒng)程序語言更多樣、更活絡(luò),開發(fā)者的接受程度也高。當(dāng)然,這兩種類型的程序語
言,各有適用之處,沒有誰取代誰的問題,而是如何選擇適當(dāng)?shù)姆椒▉硗瓿晒ぷ鳌ohn K. Ousterhout(Tcl/Tk 的創(chuàng)造者)曾在
Scripting: Higher Level Programming for the 21st Century
一文提出他的看法,他認(rèn)為腳本語言的主要目的,是在「黏合」(glue)現(xiàn)有的軟件組件,而因?yàn)閳D形操作接口、因特網(wǎng)、組件應(yīng)用框架(component
frameworks)的崛起,需要有更多、更好的腳本語言來黏合(因此腳本語言也稱為「黏合語言」(glue
languages)或「系統(tǒng)整合語言」(system integration languages)。
當(dāng)然,腳本語言本身能力的增進(jìn),以及計算機(jī)硬件的速度越來越快,也都是促進(jìn)腳本語言蓬勃發(fā)展的原因。由于腳本語言大多采用直譯的方式執(zhí)行,因此執(zhí)行效能會比利用編譯的系統(tǒng)程序語言慢。不過當(dāng)計算機(jī)硬件的速度越來越快,使用者就漸漸感覺不到腳本語言的速度較慢了。
簡單、易學(xué)、易用的腳本語言尤其適合專責(zé)系統(tǒng)或網(wǎng)絡(luò)管理的 IT
人員,因?yàn)槟_本語言的起源就是為了便利系統(tǒng)操作,而且操作系統(tǒng)的供應(yīng)者也都會加強(qiáng)這部份的功能,提供更簡易的語法、更豐富的組件,讓 IT
人員更易于「黏合」各項(xiàng)功能,而組合出絕對適合自身需要的腳本程序。
善用 Windows PowerShell
Windows PowerShell 將 Windows 環(huán)境各自分離的腳本語言(WSH)和操作指令重新緊密黏合,并且讓
Windows 擁有與 UNIX 旗鼓相當(dāng)?shù)?shell 環(huán)境和腳本語言,在在都讓 Windows 更適用于大型、復(fù)雜、重要的計算機(jī)運(yùn)算環(huán)境。
當(dāng)然 Windows PowerShell 的特色及優(yōu)點(diǎn)尚不只本文所提,但只要依照本文,讀者將能下載、安裝并親自嘗試
Windows PowerShell 的功能,尤其 Windows PowerShell
將登錄數(shù)據(jù)庫視為磁盤驅(qū)動器來存取,實(shí)在非常適當(dāng),也非常簡便,因?yàn)闄C(jī)碼、機(jī)碼值的結(jié)構(gòu),便如同目錄、檔案。在你下載、安裝 Windows
PowerShell 的同時,也別忘了下載官方相關(guān)文件,里面有最新的 Windows PowerShell 官方文件。
http://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx
參考數(shù)據(jù)及網(wǎng)絡(luò)資源
下載 Windows PowerShell:
http://www.microsoft.com/technet/scriptcenter/topics/msh/download.mspx•
TechNet Windows PowerShell Script Center:
http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx
MSDN Windows PowerShell Blog:
http://blogs.msdn.com/powershell/
posted on 2007-09-16 22:52
七星重劍 閱讀(550)
評論(0) 編輯 收藏 引用 所屬分類:
PL--WindowsShell