BATCH也就是批處理文件,有時(shí)簡(jiǎn)稱為BAT,是Windows平臺(tái)上的一種可執(zhí)行腳本,與*nix(Linux和Unix)上的Shell腳本和其他的腳本(Perl,Python)等是一樣的,實(shí)質(zhì)上就是一個(gè)文本文件,但是用特定的軟件去解釋的時(shí)候,就變成了可執(zhí)行腳本。在Windows上,可執(zhí)行腳本就是BATCH文件,也叫批處理文件,這是從DOS時(shí)代遺留下來(lái)的名字,意思就是把很多命令放到一起來(lái)執(zhí)行。它的擴(kuò)展名是*.bat,雙擊便可直接運(yùn)行,在命令行(CMD或叫做命令提示符)下面也可以當(dāng)作一個(gè)命令來(lái)運(yùn)行。因?yàn)檫@是Windows支持的東西,所以只能在Windows平臺(tái)使用。(特殊情況除外,不要鉆牛角尖,沒(méi)意思的)。比如著名的Windows垃圾清理小工具就是一個(gè)BAT批處理文件。
歸根結(jié)底是為了提高工作效率。這個(gè)解釋起來(lái)比較費(fèi)勁,因?yàn)樵贕UI大行其道的今天,再提命令行,很多人會(huì)不熟悉,或者認(rèn)為這是倒退。但是眾多關(guān)于提高工作效率的書籍都會(huì)提到命令行可以大大的提高效率,因?yàn)槊羁梢苑奖愕闹苯訉懧窂?,而不用在文件瀏覽器中一層一層的打開(kāi),和命令行可以把命令組合起來(lái),也就是把不同的命令組合起來(lái)來(lái)完成一個(gè)任務(wù),而不用打開(kāi)多個(gè)GUI窗口來(lái)做(甚至很多時(shí)候GUI窗口都是無(wú)法完成的)。對(duì)于這點(diǎn)*nix的程序猿們應(yīng)該最有體會(huì),真正的*nix高手是不會(huì)離開(kāi)命令行的。他們的工作只需打開(kāi)一個(gè)Terminal(命令行),編輯用Vim,其他全都用命令行的工具來(lái)完成,甚至他們都不用鼠標(biāo)!
Windows的CMD沒(méi)有*nix的Terminal那么強(qiáng)大,所以完全在其內(nèi)做開(kāi)發(fā)有點(diǎn)不切實(shí)際,雖然有很多工具可以讓CMD變得強(qiáng)大些,但是還是無(wú)法達(dá)到*nix那樣的地步,因?yàn)樗鼈儚母旧暇褪亲叩牟煌穆肪€*nix是為了開(kāi)發(fā)人員準(zhǔn)備的,而Windows是為了普通大眾準(zhǔn)備的。
再說(shuō)的具體一點(diǎn)就是為了DRY和Automation,也就是說(shuō)讓計(jì)算機(jī)幫你完成一些機(jī)械重復(fù)性的工作任務(wù)(對(duì)于DRY和Automation可以參考《The Productive Programmer》和《Pragmatic Programmer》)。因?yàn)锽AT可以組合命令,所以某個(gè)操作需要超過(guò)一個(gè)命令,或者參數(shù)較多時(shí),或者路徑較長(zhǎng)時(shí),就可以把它寫成BAT,變成一個(gè)簡(jiǎn)單的命令,一次二個(gè)可能沒(méi)感覺(jué),但是當(dāng)天天都用時(shí),就省去了大量的Typing。舉個(gè)例子,比如我要經(jīng)常性的在手機(jī)上抓取Tcpdump,然后查看,通常要用到如下的命令:
任何需要重復(fù)做的事情都可以嘗試用腳本來(lái)完成。比如,每天的版本更新,拷貝文件,每天都使用的命令等等。如前面所說(shuō)的,只要某些事情你超過(guò)第二次做,或者每天都做幾十次,就應(yīng)該考慮用BAT?;蛘?,某些命令很復(fù)雜,也要使用BAT,即使把二個(gè)簡(jiǎn)單命令合成一個(gè)BAT也是值得的。比如,調(diào)試的時(shí)候要查看手機(jī)內(nèi)的數(shù)據(jù),就可以用腳本來(lái)完成:
BAT是一個(gè)可執(zhí)行腳本,也就是說(shuō)它跟一個(gè)*.exe可執(zhí)行程序一樣,只要雙擊它就可以執(zhí)行了。另外的方式就是通過(guò)CMD在命令行中啟動(dòng)它,但需要給出它的路徑,也就是說(shuō)要讓解釋程序能找到它,所以推薦的做法是把所寫的BAT收集整理到一個(gè)文件夾中,然后把這個(gè)文件放到系統(tǒng)的環(huán)境變量PATH中去,這樣就可以在任何的路徑中使用了。
如,我的配置是這樣的,把所有的BAT放在D:\work\bin下面,然后把D:\work\bin加到Path變量中去。
添加環(huán)境變量的方法是右擊"我的電腦"-->"屬性"-->"高級(jí)"-->環(huán)境變量-->在用戶變量中編輯Path(如果沒(méi)有就新加一個(gè))然后把D:\work\bin加入其中,與其他的路徑用分號(hào);分隔。之后就可以像運(yùn)行內(nèi)置命令一樣來(lái)運(yùn)行它了。(如果你有權(quán)限,也可修改系統(tǒng)變量)。
它就是一個(gè)文本文件,所以用最簡(jiǎn)單的記事本就可以編輯。當(dāng)然,你用其他的強(qiáng)大的工具也可以,比如如果用Vim編輯還能有語(yǔ)法高亮等VIP級(jí)待遇。無(wú)論用什么編輯器,一定要注意保存時(shí)一定把要文件的擴(kuò)展名記為*.bat,否則就不再是可執(zhí)行腳本了,大家都是程序猿,你們懂得。
前面提到了,BAT其實(shí)就是把CMD中的命令或其他可執(zhí)行命令組合到一起,所以BAT的基石是命令,下面重點(diǎn)講下命令。
這里指的基本命令是指CMD命令中的的內(nèi)置命令,也就是help命令所顯示的命令,不包括在環(huán)境變量中的以及第三方的,那些是外部命令。
基本的命令有文件操作,文件夾操作,時(shí)間等等。比如:del, ren, rd, cd, copy, xcopy, time等等。
a. 命令的一般格式
與*nix系統(tǒng)的命令的一樣,它的格式也都是
command [options] [arguments]
其中options是控制和改變命令的行為,每個(gè)選項(xiàng)必須以/開(kāi)頭,后面跟選項(xiàng),可以把多個(gè)選項(xiàng)連在一起寫,也可以用空格格開(kāi),每個(gè)選項(xiàng)也可以跟自己的參數(shù)。arguments就是傳遞給命令的參數(shù),也就是要命令所執(zhí)行的對(duì)象。如:這里/f /q /s就是三個(gè)選項(xiàng)/f意思是強(qiáng)制刪除,/q是安靜模式,也就是刪除前不提示,/s是刪除子目錄;而tmp則是要?jiǎng)h除的對(duì)象也就是del命令的參數(shù)。
- del /f /q /s tmp
- dir /on tmp
這里的話/on是它的選項(xiàng),其中/o是選項(xiàng),意思是排序,而n是選項(xiàng)的參數(shù),合起來(lái)就是按名字排序。
通常,一個(gè)命令都有缺省的選項(xiàng)和參數(shù),也就是說(shuō)你不指定,也會(huì)有。具體選項(xiàng)不同的命令會(huì)有不同的選項(xiàng)。b. 一些通用的選項(xiàng):
雖然不同的命令有著不同的參數(shù),但是有一些共同的:
- /? 顯示幫助信息,所有的命令都有(跟*nix的-h一樣)
- /s 對(duì)于文件夾操作來(lái)講是包括子目錄(跟*nix的-r一樣)
- /q 安靜模式,也就是某些操作不要提示,比如刪除時(shí),或覆蓋文件時(shí)不要提示
c. 獲取幫助
不可能記住所有的東西,所以每當(dāng)遇到一個(gè)命令時(shí)就要獲取其幫助信息。
help command
或
command /?
就可以看到command的幫助信息。而直接用help命令,則可以查看CMD命令行的幫助,也就是說(shuō)它支持哪些內(nèi)置命令。需要注意的是help只能查看有哪些內(nèi)置以及顯示內(nèi)置命令的幫助信息。對(duì)于那些在環(huán)境變量Path中的命令,它是無(wú)法獲取幫助信息的,對(duì)于那些命令,只能通過(guò)命令本身去找?guī)椭畔ⅰ?br>
就是CMD命令行非內(nèi)置的,存在于環(huán)境變量Path中的命令,這些命令使用起來(lái)跟內(nèi)部命令無(wú)區(qū)別,都可以在CMD中直接調(diào)用。這些命令通常都是由第三方或操作系統(tǒng)提供,完成某些特定領(lǐng)域的功能,比如C:\Windows\System和C:\Windows\System32下的很多可執(zhí)行程序,都可做為外部命令來(lái)使用,比如你在命令行中直接輸入notepad然后按回車,記事本就會(huì)打開(kāi)。以及安裝的第三方程序如WinRAR等。
這些程序或許支持命令模式,或許不支持,這個(gè)要去參考程序的文檔,另外,即使其支持命令行,選項(xiàng)和參數(shù)也要參考文檔。
在BAT中以二個(gè)冒號(hào)開(kāi)頭的一行為注釋,::只能注釋一行,且必須在一行的開(kāi)頭
如:
:: This is a comment
:: copy a file to somewhere
@與echo off的作用一樣,都是DOS 批處理的一個(gè)特殊標(biāo)記符, 僅用于屏蔽命令行回顯。其中@只能影響當(dāng)前行,而echo off是關(guān)閉,直到echo on把回行顯示打開(kāi)。二個(gè)主要在BAT腳本中運(yùn)用,在命令行中直接用看不出不同。在BAT中每當(dāng)執(zhí)行一個(gè)命令時(shí),都會(huì)在CMD命令中顯示出這個(gè)命令,比如:
::mydir.bat
dir /on
這樣的腳本在運(yùn)行時(shí)會(huì)是這樣的:
D:\>mydir
D:\>dir /on
(顯示文件夾的內(nèi)容)
為了在執(zhí)行腳本時(shí)不顯示當(dāng)前命令,就要用到關(guān)閉回行顯示功能@和echo off,所以幾乎每個(gè)BAT都有這二行
@echo off
....
@echo on
在開(kāi)始腳本前關(guān)閉回行顯示,然后在結(jié)束時(shí)再打開(kāi)。用@的目的是把關(guān)閉回行顯示命令的回行顯示也不要顯示出來(lái)(抱歉,有點(diǎn)繞)。
為什么要關(guān)閉回行顯示呢?因?yàn)榛匦酗@示會(huì)跟所執(zhí)行命令的輸出混全在一起,所以看起來(lái)很不爽,特別是當(dāng)BAT腳本的命令比較多時(shí),所以要關(guān)閉它。
與*nix一樣,BAT中也可以使用管道,可以使用管道來(lái)把命令組合起來(lái),比如最常見(jiàn)的使用方式就是:
type logfile.txt | more
以分屏查看。
在BAT中用set命令來(lái)定義一個(gè)變量,然后用二個(gè)百分號(hào)來(lái)引用這個(gè)變量,所引用的地方全用所定義的值來(lái)完全替換,如:
與*nix一樣BAT也支持文件流重定向。
雖然Windows看起來(lái)與*nix相去甚遠(yuǎn)(特別是前幾年),但是BAT里面有著跟*nix和SHELL類似的一些重要的特性(管道和重定向),所以BAT還是相當(dāng)強(qiáng)大的,雖然不能跟SHELL比,但是至少可以幫助我們完成很多機(jī)械重復(fù)的工作。
跟編程語(yǔ)言(C, C++, Java, Perl)和SHELL一樣,BAT也支持命令行參數(shù),也就是執(zhí)行命令時(shí)所給的參數(shù)。在BAT中用%[1-9]來(lái)引用它們,如:
::mytype.bat
@echo off
type %1
type %2
那么在運(yùn)行時(shí),
C:\>mytype one.txt two.txt
其中%1就是one.txt,%2就是two.txt
跟C和C++語(yǔ)言一樣,還有一個(gè)%0可以用它就是腳本的名字。
在*nix的SHELL中可以用command &的形式來(lái)在后臺(tái)運(yùn)行一個(gè)命令,也就是用一個(gè)新進(jìn)程來(lái)運(yùn)行命令,而不阻塞下面的命令。有些時(shí)候這個(gè)很有用,比如你想用BAT打開(kāi)幾個(gè)XLSX文件,用如下腳本:
前面都在說(shuō)BAT如何強(qiáng)大,但是畢竟Windows沒(méi)有像*nix那樣給予命令行的強(qiáng)大支持,它跟SHELL相比還差的很遠(yuǎn),在執(zhí)行命令和文件操作方面可能沒(méi)什么大差別,但是在某些方面它還很弱:
a. 輸入的處理
雖然可以用<來(lái)重定向輸入流,但是它對(duì)輸入的處理很弱,特別的它沒(méi)的讀取的命令(SHELL中的read),它也不能按行讀入文件。所以當(dāng)涉及到文件處理時(shí),它就顯得力不從心了。
b. 文本處理的能力
如上一條說(shuō),很多時(shí)候能需要從一個(gè)文本文件讀取內(nèi)容,然后對(duì)其做一些處理。這點(diǎn)上面BAT很弱,跟SHELL是沒(méi)法比的。因?yàn)镾HELL本身有靈活的讀取函數(shù),可以按行讀,也可以把一行按不同的單詞來(lái)讀,再加上其本身有字串處理函數(shù),還有就是*nix有豐富的字串處理命令如grep, sed, ed, awk等等。當(dāng)然,現(xiàn)在這些東西也都有了Windows的版本。但是用BAT來(lái)處理文件還是一個(gè)相當(dāng)麻煩的事。
對(duì)于文本處理,最好是能用Perl等程序性的腳本來(lái)寫,它在處理輸入,讀取和處理,以及正則表達(dá)式上都有很好的支持。
某些軟件會(huì)有內(nèi)部選項(xiàng)以達(dá)到開(kāi)機(jī)自動(dòng)運(yùn)行,甚至它總是開(kāi)機(jī)自動(dòng)運(yùn)行,比如著名的QQ,迅雷暴風(fēng)影音等等。對(duì)于我來(lái)說(shuō)這些都是流氓軟件,特別是那些無(wú)法取消其開(kāi)機(jī)自動(dòng)運(yùn)行的,會(huì)造成開(kāi)機(jī)時(shí)很卡。
但是我們?nèi)粘9ぷ鞫夹枰_(kāi)一些固定的軟件,比如郵件客戶端,Eclipse,打開(kāi)某個(gè)特定的文件夾,打開(kāi)某個(gè)特定的網(wǎng)頁(yè)等等。這些正派的軟件反倒沒(méi)有“開(kāi)機(jī)自動(dòng)運(yùn)行”選項(xiàng),怎么辦呢?這時(shí)BAT就派上大用場(chǎng)了,可以寫一個(gè)叫做startup.bat,在里面把要運(yùn)行的程序都寫上,然后在Start Menu的Startup文件夾中建一個(gè)指向我們startup.bat的快捷方式:
參考資料:這幾篇文章介紹的比較詳細(xì)
基本介紹
”石頭札記 批處理文件“
這二個(gè)哥們寫了很多操作字串的BAT
"DOS -string operations"
"DOS - String Manipulation"
聯(lián)系客服