7、if 接上一章,接著(zhù)講if命令??偟膩?lái)說(shuō),if命令是一個(gè)表示判斷的命令,根據得出的每一個(gè)結果,它都可以對應一個(gè)相應的好啊作。關(guān)于它的三種用法,在這里分開(kāi)講。 (1)、輸入判斷。還是用例五里面的那幾句吧: if "%1"=="" goto usage if "%1"=="/?" goto usage 這里判斷輸入的參數情況,如果參數為空(無(wú)參數),則跳轉到usage;如果參數為/?或help時(shí)(大家一般看一個(gè)命令的幫助,是不是輸入的/?或help呢,這里這么做只是為了讓這個(gè)腳本看起來(lái)更像一個(gè)真正的程序),也跳轉到usage。這里還可以用否定形式來(lái)表示“不等于”,例如:if not "%1"=="" goto usage,則表示如果輸入參數不為空就跳轉到usage(實(shí)際中這樣做就沒(méi)意義了,這里介紹用法,管不了那么多了,呵呵。)是不是很簡(jiǎn)單?其實(shí)翻譯成中文體會(huì )一下就understand了。 (2)、存在判斷。再看例二里這句: if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif 如果存在那些gif文件,就刪除這些文件。當然還有例四,都是一樣的道理。注意,這里的條件判斷是判斷存在的,當然也可以判斷不存在的,例如下面這句“如果不存在那些gif文件則退出腳本”:if not exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一個(gè)not來(lái)表示否定而已。 (3)、結果判斷。還是拿例五開(kāi)刀(沒(méi)想到自己寫(xiě)的腳本,竟然用處這么大,呵呵): masm %1.asm 先對源代碼進(jìn)行匯編,如果失敗則暫停顯示錯誤信息,并在按任意鍵后自動(dòng)進(jìn)入編輯界面;否則用link程序連接生成的obj文件。這里只介紹一下和if命令有關(guān)的地方,&命令后面會(huì )講到。這種用法是先判斷前一個(gè)命令執行后的返回碼(也叫錯誤碼,DOS程序在運行完后都有返回碼),如果和定義的錯誤碼符合(這里定義的錯誤碼為1),則執行相應的好啊作(這里相應的好啊作為pause & edit %1.asm部分)。 另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,代碼變?yōu)椋? 看到本質(zhì)了吧?其實(shí)只是把結果判斷后所執行的命令互換了一下,“if not errorlevel 1”和“if errorlevel 0”的效果是等效的,都表示上一句masm命令執行成功(因為它是錯誤判斷,而且返回碼為0,0就表示否定,就是說(shuō)這個(gè)錯誤不存在,就是說(shuō)masm執行成功)。這里是否加not,錯誤碼到底用0還是1,是值得考慮的兩個(gè)問(wèn)題,一旦搭配不成功腳本就肯定出錯,所以一定要體會(huì )的很深刻才行。如何體會(huì )的深刻?練習!自己寫(xiě)一個(gè)腳本,然后把有not和沒(méi)有not的情況,返回碼為0或1的情況分別寫(xiě)進(jìn)去執行(怎么,嫌麻煩???排列組合算一下才四中情況你就嫌麻煩了?后面介紹管道命令和組合命令時(shí)還有更麻煩的呢!怕了?呵呵。),這樣從執行的結果中就能很清楚的看出這兩種情況的區別。 這種用errorlevel結果判斷的用法是if命令最難的用法,但也恰恰是最有用的用法,如果你不會(huì )用errorlevel來(lái)判斷返回碼,則要達到相同的效果,必須用else來(lái)表示“否則”的好啊作,是比較麻煩的。以上代碼必須變成: masm %1.asm 關(guān)于if命令的這三種用法就say到這里,理解很簡(jiǎn)單,但應用時(shí)就不一定用的那么得心應手,主要是熟練程度的問(wèn)題??赡苡械呐笥延悬c(diǎn)驚訝,我怎么沒(méi)給出類(lèi)似下面三行的用法介紹,是因為下面三行是if命令幫助里對它自身用法的解釋?zhuān)魏稳酥灰粋€(gè)“if /?”就能看到,我沒(méi)有必要在這里多費口舌;更重要的原因,是我覺(jué)得這樣介紹的不清楚,看的人不一定看的懂,所以我采用上面自己對if命令的理解來(lái)介紹。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實(shí)際上可以互換(以為從本質(zhì)上講,這三種用法都是建立在判斷的基礎上的,哲學(xué)教我們學(xué)會(huì )透過(guò)現象看事物本質(zhì)?。?。有興趣的朋友可以自己研究一下。 IF [NOT] ERRORLEVEL number do command 學(xué)過(guò)匯編或C的朋友,肯定都知道call指令表示什么意思了,在這里它的意思其實(shí)也是一樣的。在批處理腳本中,call命令用來(lái)從一個(gè)批處理腳本中調用另一個(gè)批處理腳本??蠢耍J的三個(gè)腳本文件名分別為start.bat、10.bat和ipc.bat): start.bat: 10.bat: ipc.bat: 有沒(méi)有看出什么不對的地方?沒(méi)看出來(lái)???沒(méi)看出來(lái)就對了,其實(shí)就沒(méi)有不對的地方嘛,你怎么看的出來(lái)!從上面兩個(gè)腳本,你可以得到如下信息:1、腳本調用可以靈活運用,循環(huán)運用、重復運用。2、腳本調用可以使用參數!關(guān)于第一點(diǎn)就不多說(shuō)了,聰明的你一看就應該會(huì ),這里說(shuō)一下第二點(diǎn)。 在start.bat中,10.bat后面跟了參數0,在執行時(shí)的效果,其實(shí)就是把10.bat里的參數%1用0代替。在start.bat中,ipc.bat后面跟了參數ipcfind.txt(一個(gè)文件,也可以做參數),執行時(shí)的效果,就是用ipc.bat中的每一行的三個(gè)變量(這里不懂沒(méi)關(guān)系,學(xué)過(guò)for命令后就懂了),對應代換ipc.bat中的%%i、%%j和%%k。這里參數調用是非常靈活的,使用時(shí)需要好好體會(huì )。在初學(xué)期間,可以先學(xué)習只調用腳本,至于連腳本的參數一起使用的情況,在后面的學(xué)習中自然就會(huì )有比較深刻的理解,這是因為當你已經(jīng)可以靈活運用批處理腳本后,如何使代碼寫(xiě)的更精簡(jiǎn)更完美更高效就自然包括到了考慮的范圍,這時(shí)候你就會(huì )發(fā)現在調用腳本時(shí)直接加入參數,可以使代碼效率加倍。By the way,上面的這幾個(gè)腳本,都是Bat.Worm.Muma病毒的一部分,在后面的教程里,大家將有機會(huì )見(jiàn)到這個(gè)病毒的真面目。 net send %1 This is a call example. 這兩句一結合,效果自然不怎么樣,因為只有一臺機器來(lái)發(fā)消息,誰(shuí)怕誰(shuí)???我給你來(lái)個(gè)禮尚往來(lái)!可如果有100臺機器同時(shí)執行,而且每臺機器開(kāi)10和窗口同時(shí)向一個(gè)目標機器發(fā)消息的話(huà),呵呵。這里call a.bat的作用就是調用自身,執行完前一句net send命令后再調用自身,達到了循環(huán)執行的目的。 call a.bat 一定要在DOS窗口下執行,否則只會(huì )看到一個(gè)窗口一閃而過(guò),看不到最后結果。等執行完后,當腳本被執行了1260次,別忘了想一下到底是為什么!愛(ài)情有時(shí)候跟這個(gè)腳本一樣,一旦陷入死循環(huán),最后的結果都是意想不到的。只是愛(ài)情,絕對不會(huì )等到被毫無(wú)理由的循環(huán)這么多次,也許在第三次時(shí)就出現了love is aborted的提示。 9、find 這是一個(gè)搜索命令,用來(lái)在文件中搜索特定字符串,通常也作為條件判斷的鋪墊程序(我怎么突然想起了這四個(gè)字?)。這個(gè)命令單獨使用的情況在批處理中是比較少見(jiàn)的,因為沒(méi)什么實(shí)際意義。還是借例三來(lái)說(shuō)明: @echo off 先用netstat命令檢查是否有冰河默認的端口7626在活動(dòng),并把結果保存到a.txt中。然后使用type命令列出a.txt中的內容,再在列出的內容中搜索字符串“7626” ,發(fā)現有的話(huà)則提示中了冰河,否則退出???,find命令其實(shí)就這么簡(jiǎn)單,但有一點(diǎn)必須要注意到:如果不使用type命令列出a.txt中的內容,而是直接使用find命令在a.txt中找“7626”(find a.txt "7626" && echo "Congratulations! You have infected GLACIER!"),就必須得給出這個(gè)a.txt的絕對路徑(我試過(guò)了,find并沒(méi)有默認路徑就是當前路徑的功能,必須手動(dòng)指定。也許是我錯了,歡迎指正)。因為在find命令的幫助里有這么一句話(huà):如果沒(méi)有指定路徑,find將搜索鍵入的或者由另一個(gè)命令產(chǎn)生的文字。這里的“另一個(gè)命令”自然就指的type命令了。 至于find命令的其他幾個(gè)參數如v、n、i等,有興趣的朋友自己去研究吧,這已經(jīng)屬于DOS學(xué)習的內容了,這里就不做介紹。關(guān)于find命令和其他命令的一些更精妙的用法(有些簡(jiǎn)直令人叫絕),后續的教程中將介紹,希望關(guān)注。 10、for、set、shift 為什么把這三個(gè)命令放到一起來(lái)講?原因除了我說(shuō)明外,恐怕誰(shuí)也想不到!很簡(jiǎn)單的一句話(huà):其實(shí)我也不太懂!是的,對于這兩個(gè)命令,我是從研究Bat.Worm.Muma病毒開(kāi)始學(xué)習的,時(shí)間過(guò)去了不少,但還是沒(méi)完全搞明白,我怕講出來(lái)連自己都看不懂,我更怕不小心講錯了成了罪人。所以我給出一個(gè)腳本去告訴你,如何讓這兩個(gè)命令給自己留一個(gè)初步的印象,其實(shí)也就是這兩個(gè)命令的入門(mén),而并不是說(shuō)如何領(lǐng)會(huì )這兩個(gè)命令。因為要領(lǐng)會(huì )如此精妙的兩個(gè)命令(特別是for)談何容易!也許你會(huì )表?yè)P我說(shuō)我誠實(shí)、不懂就不懂;也許你會(huì )罵我,讓我既然不懂就趕緊滾蛋,不要在這里丟人顯眼;也許你還會(huì )說(shuō)一些別的這樣那樣好聽(tīng)或不好聽(tīng)的話(huà),都隨便你了,即使我不同意你說(shuō)的話(huà),我也會(huì )誓死捍衛你說(shuō)話(huà)的權利??蠢唬?/p> @echo off 執行后在當前路徑下就生成for.txt、set.txt和shift.txt三個(gè)文件,里面分別記錄了for命令、set命令和shift命令的幫助信息。地球人都能看懂,我就不多說(shuō)了。我在網(wǎng)上曾經(jīng)找了很長(cháng)時(shí)間這三個(gè)命令的教程,但都不理想,基本都是照搬的幫助信息。我想在自己完全掌握了這兩個(gè)命令后,一定要寫(xiě)一篇用自己的文字總結出來(lái)的for、set和shift教程(關(guān)于shift命令,后面介紹批處理的參數時(shí)還將涉及到),一定會(huì )的,這是我的心愿之一!需要注意的一點(diǎn)是,這三個(gè)命令的幫助里 ,介紹的都比較死板,雖然也舉了一些例子,但這是遠遠不夠的。要掌握這兩個(gè)命令,最需要的就是耐心!沒(méi)寫(xiě)錯,就是耐心。光是認真看完它們的幫助文字就已經(jīng)需要足夠的耐心了,要進(jìn)一步練習領(lǐng)會(huì )這兩個(gè)命令,難道不需要更大的耐心?實(shí)戰練習的機會(huì )我會(huì )留給你的,關(guān)鍵還是那句話(huà),看你有沒(méi)有耐心去研究了??纯蠢?nbsp; START.BAT: 沒(méi)錯,這就是批處理的魅力,這就是愛(ài)的魅力。讓你受了傷還感謝傷你的人。這種感覺(jué)就好象在自己最喜歡的音樂(lè )聲中被人強奸,痛并快樂(lè )著(zhù)。 不得不再次重申一遍,各種DOS命令是批處理的BODY(我實(shí)在找不出一個(gè)更合適的詞來(lái)形容他們之間的關(guān)系),學(xué)好DOS命令是學(xué)好批處理的前提。其他DOS命令如copy、dir、del、type、path、break、start等內部命令,以及ping、net、cmd、at、sort、attrib、fc、find等外部命令,在批處理里的應用非常廣泛。這篇教程的作用,是教你認識批處理,以及如何利用DOS命令組合出來(lái)一個(gè)完美的批處理腳本,去讓它自動(dòng)完成你想要它做的事情。而靈活自如的編輯一個(gè)批處理腳本是建立在熟練掌握DOS命令的基礎上的,這已經(jīng)超出了本文的范疇,在此就不贅述了。 不知不覺(jué)中第三章已經(jīng)結束了。耳麥里傳來(lái)的依然是陳曉東的《比我幸?!?,每隔4分32秒就自動(dòng)重播。雖然我不并不很喜歡陳曉東,可這并不妨礙我喜歡音樂(lè ),喜歡這首描寫(xiě)的如此讓人感慨的歌。請你一定要比我幸福/才不枉費我狼狽退出/再痛也不說(shuō)苦/愛(ài)不用抱歉來(lái)彌補/至少我能成全你的追逐/請記得你要比我幸福/才值得我對自己殘酷/我默默的倒數/最后再把你看清楚/看你眼里的我好饃糊/慢慢被放逐。我如同一個(gè)因年老失色而拉不到客的老***女,絕望的徘徊在曾經(jīng)輝煌的紅燈區,用一臉的木然瞟一眼來(lái)來(lái)去去的人群,默默的回憶自己并不光彩的過(guò)去,幻想自己將要面對的未來(lái)。直到看見(jiàn)那些幸福依偎在一起的情侶們,才突然間發(fā)現上帝的公平,和這種公平的殘忍。 可以說(shuō),批處理腳本中最重要的幾個(gè)命令我都沒(méi)有給出如echo或if那樣比較詳細的介紹,原因我已經(jīng)說(shuō)了,因為我也是個(gè)菜,我也不太懂----但我正在學(xué)!你呢?今天又去了一趟圖書(shū)館,淘金一樣發(fā)現了一本叫《DOS批文件》的東東,藏在一個(gè)角落里落滿(mǎn)了灰,五本摞一起就跟磚頭一樣厚了。大概翻了一下,里面介紹了很多比較底層和基礎的東西,雖然從思路上講,已經(jīng)有點(diǎn)time out了,很多東西已經(jīng)基本沒(méi)有利用的價(jià)值(這就是信息時(shí)代的更新速度),但還是很值得看的。于是打算下午淘過(guò)來(lái),放假回去了再好好研究一番,連同那幾個(gè)不熟悉的命令一起搞熟了,再續寫(xiě)這篇教程。我始終堅信,沒(méi)有最好只有更好。 但是很可惜,等到下午再去的時(shí)候,圖書(shū)館樓梯口已經(jīng)立了一個(gè)牌子,上面寫(xiě)著(zhù)out of service----人家這學(xué)期的工作結束了。于是回到宿舍打算繼續寫(xiě)第四章,正在這時(shí)又得到一個(gè)“振奮人心”的消息:期末考試有一科掛了,而且是全班第一----這一門(mén)整個(gè)班里就掛了我一個(gè)。郁悶的情緒剎那間涌上心頭,整個(gè)世界仿佛都變成黑的了。食堂和小賣(mài)部已經(jīng)陸續關(guān)門(mén),學(xué)校里的人越來(lái)越少,迎面過(guò)來(lái)的幾個(gè)同學(xué)也都一身行李,忙碌著(zhù)準備回家過(guò)年,內心的孤寂和失落如同夏日里暴雨前的烏云,迅速而不可抗拒的占領(lǐng)了心里每一個(gè)角落。迎著(zhù)一月的冷風(fēng)我一個(gè)人在天橋上發(fā)呆,還能怎么樣,連期末考試都應付不了的失敗男人。 “課間休息”時(shí)間好象長(cháng)了點(diǎn),呵呵,上課了!從這一章開(kāi)始,將詳細介紹批處理中常用的幾個(gè)組合命令和管道命令。這些命令雖然不是必須的,如同愛(ài)一個(gè)人時(shí)不一定非得每天去陪,但如果少了這個(gè)過(guò)程,事情就會(huì )變的復雜而不完美,所以我認為管道命令和組合命令是批處理的調味劑,幾乎是少不了的。 下面從管道命令講起。常用的管道命令有以下這些:|、>、>> 11、| 這個(gè)命令恐怕大家不是很陌生,經(jīng)常好啊作DOS的朋友都應該知道,當我們查看一個(gè)命令的幫助時(shí),如果幫助信息比較長(cháng),一屏幕顯示不完時(shí)DOS并不給我們時(shí)間讓我們看完一屏幕再翻到另一屏幕,而是直接顯示到幫助信息的最后。如在提示符下輸入help回車(chē)時(shí),就會(huì )看到當前DOS版本所支持的所有非隱含命令,但你只能看到最后的那些命令,前面的早就一閃而過(guò)了,如何解決這個(gè)問(wèn)題?看例十三: help | more 回車(chē)后會(huì )發(fā)現顯示滿(mǎn)一屏幕后就自動(dòng)暫停,等候繼續顯示其他信息。當按寫(xiě)回車(chē)時(shí),變成一個(gè)一個(gè)的出現;按下空格鍵時(shí)一屏幕一屏幕顯示,直到全部顯示完為止;按其他鍵自動(dòng)停止返回DOS。 為什么會(huì )出現上述現象?答案很簡(jiǎn)單,這里結合了管道命令|和DOS命令more來(lái)共同達到目的的。這里先簡(jiǎn)單介紹一下help命令和more命令,對理解|命令的用法有很大幫助。 11.1、help命令。其實(shí)這個(gè)命令是不需要多說(shuō)的,但在上述例子中help命令的用法比較特殊,直接在DOS提示符下輸入help命令,結果是讓DOS顯示其所支持的所有非隱含命令,而在其他地方用help命令,如輸入net help回車(chē),則是顯示net命令的幫助信息。 11.2、more命令??赡芎芏嗯笥岩郧熬蜎](méi)有接觸過(guò)這個(gè)命令,這個(gè)命令在Linux下的用處非常廣泛,也是管道命令之一。大家可以找一篇比較長(cháng)的文章(a.txt)在DOS提示符下輸入如下兩個(gè)命令去比較一下差別:more a.txt和type a.txt。利用more命令,可以達到逐屏或逐行顯示輸出的效果,而type命令只能一次把輸出顯示完,最后的結果就是只能看到末尾的部分。在例十三里,more命令的作用就是讓輸出的信息逐屏或逐行顯示。 help > a.txt 這里利用另一管道命令>生成了一個(gè)a.txt文件作為中間環(huán)節,在用more命令查看a.txt文件后再刪除a.txt文件(例十三的所有好啊作是在內存中進(jìn)行的,不生成文件)??梢钥闯?,正確使用管道命令|可以帶來(lái)事半功倍的效果。 結合例十三和例十四,以及前面的例九再體會(huì )一遍:|命令的作用,就是讓前一命令的輸出當做后一命令的輸入。 12、>、>> 這兩個(gè)命令的效果從本質(zhì)上來(lái)說(shuō)都是一樣的,他們都是輸出重定向命令,說(shuō)的通俗一點(diǎn),就是把前面命令的輸出寫(xiě)入到一個(gè)文件中。這兩個(gè)命令的唯一區別是,>會(huì )清除掉原有文件中的內容后把新的內容寫(xiě)入原文件,而>>只會(huì )另起一行追加新的內容到原文件中,而不會(huì )改動(dòng)其中的原有內容。例十五: echo @echo off > a.bat 依次在DOS提示符下輸入以上各行命令,一行一個(gè)回車(chē),將在當前目錄下生成一個(gè)a.bat文件,里面的內容如下: @echo off 看到這里,你得到了多少信息?1、可以直接在DOS提示符下利用echo命令的寫(xiě)入功能編輯一個(gè)文本,而不需要專(zhuān)門(mén)的文本編輯工具;2、管道命令>和>>的區別如上所述。如果這里只用>命令來(lái)完成上面好啊作,最后也會(huì )生成一個(gè)a.bat,但里面的內容就只剩下最后一行exit了。所以>和>>一般都聯(lián)合起來(lái)用,除非你重定向的輸出只有一行,那么就可以只用>了。結合例一再仔細體會(huì )輸出重定向管道命令>和>>的用法。 13、<、>&、<& 這三個(gè)命令也是管道命令,但它們一般不常用,你只需要知道一下就ok了,當然如果想仔細研究的話(huà),可以自己查一下資料。 <,輸入重定向命令,從文件中讀入命令輸入,而不是從鍵盤(pán)中讀入。 關(guān)于這三個(gè)管道命令的舉例,在后面批處理腳本的精妙應用中還將涉及到。 組合命令,顧名思義,就是可以把多個(gè)命令組合起來(lái)當一個(gè)命令來(lái)執行。這在批處理腳本里是允許的,而且用的非常廣泛。它的格式很簡(jiǎn)單----既然現在已經(jīng)成了一個(gè)文件了,那么這多個(gè)命令就要用這些組合命令連接起來(lái)放在同一行----因為批處理認行不認命令數目。組合命令的作用,就如同給愛(ài)人陪不是,說(shuō)一句是說(shuō),說(shuō)十句也是說(shuō),不一次把好話(huà)都說(shuō)了出來(lái),效果可能會(huì )好些----當然得排除一種特殊情況:這些話(huà)是否有先后順序,有些話(huà)是否可以同時(shí)說(shuō)。在批處理腳本里也一樣,有些時(shí)候某些命令是不能同時(shí)執行的,后面給你說(shuō)。 剛剛又送走了一個(gè)同學(xué),人去樓空的感覺(jué)越來(lái)越明顯,望著(zhù)空蕩蕩的床鋪,平日里喧鬧的宿舍就只剩下我一個(gè)人了,整個(gè)世界只有那個(gè)平時(shí)令人非常討厭的老鼠這時(shí)候才顯得可愛(ài)起來(lái)----只有它會(huì )陪著(zhù)我在這不敢開(kāi)燈的漆黑夜里----一個(gè)連期末考試都應付不了的失敗男人。失??!我感到快要呼吸不過(guò)來(lái),這種失敗的壓力簡(jiǎn)直令我窒息,簡(jiǎn)直讓我的手接收不到大腦的信號,簡(jiǎn)直讓這篇未完成的教程夭折。但我能怪誰(shuí)? |
聯(lián)系客服