PowerShell應(yīng)當(dāng)已經(jīng)名正言順地成為批處理(Cmd.exe shell腳本)的替代者了,但是因?yàn)橐恍┰?,許多人都不是很情愿拋棄批處理。這篇文章將作為一個(gè)系列文章的開(kāi)始幫助你打破批處理的習(xí)慣,向PowerShell進(jìn)軍。
在我進(jìn)入這些文章系列之前,我想先稍微講述一下關(guān)于批處理文件的一些歷史和為什么你需要使用PowerShell來(lái)代替老風(fēng)格的批處理代碼編寫(xiě)你的腳本。
批處理文件的歷史
批處理文件擁有很悠久的歷史了,微機(jī)操作系統(tǒng)上的一個(gè)CP/M ,擁有可提交的命令,它可以將文本文件中的一系列命令逐行運(yùn)行。它非常簡(jiǎn)單(因?yàn)楫?dāng)時(shí)的內(nèi)存很吃緊),不支持任何類型的條件分支。
當(dāng)開(kāi)發(fā)MS-DOS時(shí),微軟在它的Command.com命令解釋器中,也納入了非常類似的批處理功能:把命令存在一個(gè)文本文件中,命名為.Bat的擴(kuò)展名,然后命令解釋器就會(huì)運(yùn)行它里面的每一個(gè)命令。
在以后的DOS版本中,微軟通過(guò)多種方式擴(kuò)展了批處理文件。增加了標(biāo)簽,GOTO語(yǔ)句,和If語(yǔ)句來(lái)處理分支。很重要的一點(diǎn),批處理“語(yǔ)言”不是被設(shè)計(jì)出來(lái)的。它只是脫胎于CP/M可提交命令而已。
Windows NT 和 Cmd.exe
很快就到了Windows NT (1993)了,微軟納入了一個(gè)控制臺(tái)模式的應(yīng)用程序,Cmd.exe,直到這一天它也才呈獻(xiàn)給用戶的一個(gè)傳說(shuō)中的“C: 提示符”。cmd.exe是舊的MS-DOS上的Command.com的一個(gè)超集,甚至使用很多相同的命令。命令類似,它的設(shè)計(jì)向后兼容,以確保用戶能夠運(yùn)行舊的MS-DOS上的批處理文件。Cmd.exe也能運(yùn)行帶有.Bat 擴(kuò)展名“批處理文件”。
Cmd.exe 和 Command.com之間的相似性是它對(duì).Bat文件的向后兼容性,微軟剛開(kāi)始選擇的Cmd.exe圖標(biāo)(“MS-DOS” logo)導(dǎo)致了用戶困惑多年。即使在今天我們?cè)谝恍┱搲鐓^(qū),還會(huì)看到一些提問(wèn)“如何用DOS干什么什么”,事實(shí)上這關(guān)DOS鳥(niǎo)事。
Cmd.exe比 Command.com擁有更多的功能,相應(yīng)的也就是批處理文件的擴(kuò)展。其中就包括 For /f的迭代,簡(jiǎn)單的使用Call命令來(lái)調(diào)用子程序,環(huán)境的指定(Setlocal and Endlocal)。雖然這些增強(qiáng),讓批處理“語(yǔ)言”更加實(shí)用,它仍然還是有許多缺陷,這讓寫(xiě)一個(gè)簡(jiǎn)單的批處理程序變成一件令人頭疼的事。
Windows Script 主機(jī)
從Windows 2000(1999)開(kāi)始,微軟通過(guò)引入Windows Script Host 兩個(gè)真正的,內(nèi)置的,可編程語(yǔ)言(VBScript和JScript 微軟版本低Javascript)來(lái)增強(qiáng)它的腳本功能。 WSH腳本依賴于COM對(duì)象來(lái)在操作系統(tǒng)和應(yīng)用程序之間進(jìn)行交互。盡管WSH極其實(shí)用和強(qiáng)大,它受限于機(jī)器上必須安裝所需的COM對(duì)象,并且沒(méi)有提供命令行界面。
進(jìn)入 Windows PowerShell
批處理和WSH腳本沒(méi)有提供一致性,因?yàn)樗鼈兪莾煞N分開(kāi)的增強(qiáng)工具,擁有不同的用戶接口(批處理和wSH腳本是兩碼事)。微軟意識(shí)到了這一點(diǎn),在2006年發(fā)布了Windows PowerShell的第一個(gè)版本,結(jié)束了列國(guó)混戰(zhàn)的局面,一統(tǒng)了Windows腳本的江湖。PowerShell基于.NET 框架,提供了一個(gè)命令行,和管理Windows 操作系統(tǒng)的接口。
現(xiàn)在我們擁有了Windows PowerShell,沒(méi)有任何必要再去編寫(xiě)舊式的的批處理文件(Cmd.exe shell腳本)。展望未來(lái)吧,你應(yīng)當(dāng)將你的精力放在學(xué)習(xí)PowerShell上,主要是因?yàn)槲④浺呀?jīng)將PowerShell定位成Windows操作系統(tǒng)自動(dòng)化和企業(yè)應(yīng)用程序管理的默認(rèn)工具了。
為什么是時(shí)候停止寫(xiě)批處理了
這里給出你應(yīng)當(dāng)停止寫(xiě)批處理文件,而轉(zhuǎn)向PowerShell腳本的五個(gè)理由。
1.PowerShell是未來(lái),是標(biāo)桿。微軟已經(jīng)將PowerShell定位為Windows操作系統(tǒng)和微軟企業(yè)應(yīng)用程序管理的默認(rèn)工具了。許多第三方供應(yīng)商也提供了PowerShell類庫(kù)用來(lái)管理他們的產(chǎn)品。
2.批處理是晦澀難懂的,它有很多缺陷。我以前經(jīng)常去一些腳本提問(wèn)的網(wǎng)站,我都數(shù)不清我問(wèn)過(guò)多少次諸如為什么環(huán)境變量展開(kāi)后不正確啦,為什么命令運(yùn)行后不正確啦。真的沒(méi)有必要把自己耗在cmd.exe上了。批處理的限制太多了,投入到PowerShell的懷抱中吧!
3.PowerShell是支持批處理和命令行的,轉(zhuǎn)向PowerShell并不是說(shuō)拋棄了批處理,老式的批處理文件仍然可以在PowerShell上很好地運(yùn)行,命令行工具也仍然在PowerShell上能夠完美兼容運(yùn)行。
4.PowerShell是真正的腳本編程語(yǔ)言,你可能還沒(méi)有嘗到PowerShell的甜頭,尤其當(dāng)你嘗試體驗(yàn)一些復(fù)雜邏輯時(shí),在PowerShell中明顯比CMD.exe要簡(jiǎn)單地多。許多時(shí)候,一行PowerShell命令行,能夠替代成百上千的批處理代碼。
5.PowerShell 使用的是對(duì)象,不像Cmd.exe和其它基于文本的Shell只能使用文本的命令輸出。另一方面PowerShell使用的是.NET 對(duì)象,那些昔日在批處理中比較棘手的問(wèn)題(比如日期時(shí)間的解析)在PowerShell中變得出奇的簡(jiǎn)單。
扔下批處理吧
Cmd.exe短期內(nèi)不會(huì)消亡,但是也沒(méi)有什么理由值得我們?cè)谶@老式的批處理語(yǔ)言上煞費(fèi)苦心,把它扔下來(lái),使用PowerShell來(lái)代替它吧!