Getting Started with Windows Batch Scripting
Windows批處理腳本兼容性非常好 - 它適用于任何現(xiàn)代Windows機器。 你可以在任何一臺現(xiàn)代Windows機器上創(chuàng)建和修改批處理腳本。 這些工具從盒子里出來:Windows 命令提示符和一個像 Notepad.exe
這樣的文本編輯器。 這絕對不是最好的shell腳本語言,但它能完成工作。
Launching the Command Prompt
使用快捷鍵 Windows Logo Key
+ R
, 輸入 cmd.exe
然后按回車鍵,運行 Windows 命令提示符。這比從開始菜單找到命令提示符要快的多。
Editing Batch Files
批處理文件的通用文本編輯器是記事本(Windows Logo Key
+ R
, 輸入 notepad.exe
, 回車)。由于批處理文件只是ASCII文本,所以可以使用任何文本編輯器或文字處理軟件。很少有編輯器能做到語法高亮,或者關(guān)鍵字的支持,所以記事本已經(jīng)足夠好了,它預(yù)裝在每一臺Windows系統(tǒng)上。
Viewing Batch Files
我堅持使用記事本查看批處理文件。在Windows資源管理器(又名“我的電腦”)中,你可以記事本中查看批處理文件,方法是右鍵單擊該文件并從文菜單中選擇“編輯”。如果你想在命令提示符窗口中查看文件內(nèi)容,可以使用DOS命令,例如 TYPE myscript.cmd
或者 MORE myscript.cmd
或者 EDIT myscript.md
。(在 Windows 10 中,EDIT
不可用)
Batch File Names and File Extensions
假設(shè)你使用的是Windows XP 或者更新的版本,我建議保存的批處理文件,文件擴展名為 .cmd
。 一些過時的Windows版本使用 .bat
,因此我推薦更為現(xiàn)代的 .cmd
來避免 .bat
帶來的副作用。
使用.cmd文件擴展名,你可以使用你喜歡的文件名。建議文件名中避免使用空格,空格在腳本中令人頭疼。有個簡單辦法,可以避免使用空格,使用 Pascal 命名法則來命名(例如: HelloWorld.cmd
代替 Hello World.cmd
)。也可以使用標(biāo)點符號,比如 .
或者 -
(例如: Hello.World.cmd
, Hello-world.cmd
, Hello_World.cmd
)。
批處理文件命名另外一個需要注意的是,命名避免與系統(tǒng)內(nèi)置的命令或者一些常用的軟件相同。例如,避免使用 ping.cmd
,因為系統(tǒng)中有個 ping.exe
的可執(zhí)行文件。如果運行ping
命令,你真正想要運行的是 ping.cmd
, 但可能無意調(diào)用的是 ping.exe
, 這樣就顯得很混亂。我可能會將腳本命名為 RemoteHeartbeat.cmd
或者類似的東西為腳本的名稱添加一些上下文,避免與其他可執(zhí)行文件命名沖突。當(dāng)然,在特殊情況下,不得不修改 ping
的默認行為,那這個命名的建議就無所謂了。
Saving Batch Files in Windows
默認情況下,記事本會嘗試將所有文件都保存為純文本文件。要使記事本保存擴展名為 .cmd
的文件,需要將“保存類型”更改為“所有文件(.)” 如下圖所示。
補充:在截圖中使用了一個快捷方式,后續(xù)好介紹更多。通過命名
%USERPROFILE%\HelloWorld.cmd
把文件保存到用戶資料
文件下。%USERPROFILE%
是Windows系統(tǒng)的一個環(huán)境變量,它指向你的用戶
目錄,如:C:\Users
。在較新的Windows系統(tǒng)上,用戶資料
指的是C:\Users\<用戶名>
。這能夠節(jié)約一點時間,因為命令提示符默認的工作目錄就是C:\Users\<用戶名>
。這樣運行HelloWorld.cmd
腳本就不需要切換目錄。
Running your Batch File
在Windows中運行批處理文件的簡單方法是雙擊Windows資源管理器(又名“我的電腦”)中的批處理文件。然而這樣操作,命令提示符不會給你多少時間看到輸出或者任何錯誤,腳本運行完成后就立即退出,你只能看到一個窗口一閃而過。(我們將在Part 10 – Advanced Tricks 部分中學(xué)習(xí)如何處理這個問題)。
運行新編寫的腳本,我們需要在現(xiàn)有的命令窗口中運行它。對于新手來說,最簡單的方法就是把腳本拖放在命令提示窗口中。命令提示符將在命令行中輸入腳本的完整路徑,并包含空格路徑用雙引號括起來(如果不包含空格,則不會),如下圖所示。
其他的一些技巧:
- 通過
向上鍵
和向下鍵
來瀏覽之前運行過的命令。 - 像這樣來運行腳本:
%COMPSPEC% /C /D "C:\Users\User\SomeScriptPath.cmd" Arg1 Arg2 Arg3
這樣會啟動一個新的命令提示符,并在這個進程中運行腳本。/C
的意思是在腳本運行完成后退出子進程。/D
是禁止所有自動運行的腳本。這樣做的原因是可以阻止命令提示窗口自動關(guān)閉,如果我寫的腳本或者調(diào)用的腳本中調(diào)用了EXIT
命令。EXIT
命令會自動關(guān)閉命令提示符窗口,除非是從子命令提示符進程中調(diào)用EXIT
。
Comments
官方的注釋方式是使用 REM
(Remark) 關(guān)鍵字。
REM This is a comment!
還有一種經(jīng)常被忽略掉的高級用法,使用 ::
,兩個冒號。
:: This is also a comment too! (usually!!)
多數(shù)的高級作者發(fā)現(xiàn),::
相比 REM
能減少注意力分散,但是注意,有幾個地方 ::
會導(dǎo)致錯誤。
比如,一個 for 循環(huán)中使用 ::
就會導(dǎo)致錯誤。如果有這種情況,只需要換回 REM
即可。
Silencing Display of Commands in Batch Files
批處理文件中的第一個非注釋行,通常是一條關(guān)閉輸出的命令。
@ECHO OFF
@
是一個特殊的操作符,用于抑制命令行的打印。一旦我們關(guān)閉了輸出,在后續(xù)的腳本命令中就不再需要 @
操作符了。
可以使用以下命令恢復(fù)打印:
ECHO ON
當(dāng)腳本退出時,命令提示符會自動將ECHO恢復(fù)到它以前的狀態(tài)。
Debugging Your Scripts
批處理文件涉及大量的試驗和錯誤編碼。我不知道有什么真正的Windows批處理腳本調(diào)試器。更糟的是,我也不知道如何將命令處理程序的輸出設(shè)置成詳細狀態(tài),以幫助解決腳本問題(這是Unix/Linux腳本的常用技術(shù)。)。使用 ECHO
命令打印自定義的臨時(ad-hoc[1])調(diào)試消息是唯一的選擇。高級腳本編寫者可以通過一些技巧來有選擇地打印調(diào)試消息,我更喜歡在腳本運行正常時刪除調(diào)試/檢測代碼。