包你學(xué)會批處理整理集合第2/3頁
5、:和goto
為什么要把這兩個命令聯(lián)合起來介紹?因為它們是分不開的,無論少了哪個或多了哪個都會出錯。goto是個跳轉(zhuǎn)命令,:是一個標簽。當程序運行到goto時,將自動跳轉(zhuǎn)到:定義的部分去執(zhí)行了(是不是分不開?)。例五中倒數(shù)第5行行首出現(xiàn)一個:,則程序在運行到goto時就自動跳轉(zhuǎn)到:標簽定義的部分執(zhí)行,結(jié)果是顯示腳本usage(usage就是標簽名稱)。不難看出,goto命令就是根據(jù)這個冒號和標簽名稱來尋找它該跳轉(zhuǎn)的地方,它們是一一對應(yīng)的關(guān)系。goto命令也經(jīng)常和if命令結(jié)合使用。至于這兩個命令具體用法,參照例五。
goto命令的另一種用法一:提前結(jié)束程序。在程序中間使用goto命令跳轉(zhuǎn)到某一標簽,而這一標簽的內(nèi)容卻定義為退出。如:
……
goto end
……
:end
這里:end在腳本最后一行!其實這個例子很弱,后面講了if命令和組合命令你就知道了。
6、%
這個百分號嚴格來說是算不上命令的,它只是批處理中的參數(shù)而已(多個%一起使用的情況除外,以后還將詳細介紹),但千萬別以為它只是參數(shù)就小看了它(看看例五中有多少地方用到它?),少了它批處理的功能就減少了51%了??纯蠢撸?/p>
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è)這個腳本被保存為a.bat,則執(zhí)行形式如下:a IP username password。這里IP、username、password是三個參數(shù),缺一不可(因為程序不能正確運行,并不是因為少了參數(shù)語法就不對)這樣在腳本執(zhí)行過程中,腳本就自動用用你的三個參數(shù)依次(記住,是依次!也是一一對應(yīng)的關(guān)系。)代換1%、2%和3%,這樣就達到了靈活運用的目的(試想,如果在腳本中直接把IP、username和password都定義死,那么腳本的作用也就被固定了,但如果使用%的話,不同的參數(shù)可以達到不同的目的,是不是更靈活?)。
關(guān)于這個參數(shù)的使用,在后續(xù)章節(jié)中還將介紹。一定要非常熟練才行,這需要很多練習(xí)過程,需要下點狠工夫!
這一章就寫到這里了??赡苡信笥褑柫耍涸趺礇]介紹if命令?呵呵,不是我忘了,而是它不容易說清楚,下一章再講了!這一章講的這點東西,如果你是初學(xué)者,恐怕也夠消化的了。記住一句話:DOS是批處理的BODY,任何一個DOS命令都可以被用在批處理腳本中去完成特定的功能。到這里,你是否已經(jīng)想到了用自己肚子里的東西去寫點帶有自動化色彩的東東呢?很簡單,就是一個DOS命令的集合而已,相信自稱為天才的你已經(jīng)會把計算機等級考試上機試題中的DOS部分用批處理來自動化完成了。
煩!就好象一個半老女人到了更年期,什么事都想嘮叨幾句,什么事都感到不舒服,看誰誰不爽。明知山有虎,偏向虎山行,最后留下一身傷痕無功而返時,才發(fā)現(xiàn)自己竟然如此脆弱,如此渺小,如此不堪一擊。徘徊在崩潰的邊緣,突然回想起了自己最后一次扁人的那一刻,還真有點懷念(其實我很不喜歡扁人,更不喜歡被人扁)。我需要發(fā)泄,我用手指拼命的敲打著鍵盤,在一陣接一陣有節(jié)奏的聲音中,屏幕上出現(xiàn)了上面的這些文字。可難道這就是發(fā)泄的另一種方式嗎?中國人還是厲害,早在幾千年前孔老夫子就說過“唯女子與小人,難養(yǎng)也”,真**有先見之明,佩服!雖然是在發(fā)泄,不過大家請放心,以我的脾氣,既然決定寫這篇教程,就一定會盡力去寫好,寫完美,絕對不給自己留下遺憾,要不這教程就不是我寫的!
曾經(jīng)有一篇經(jīng)典的批處理教程出現(xiàn)在你的屏幕上,你沒有保存,直到找不到它的鏈接你才后悔莫及,人世間最大的痛苦莫過于此。如果上天能給你一個再看一次的機會,你會對那篇教程說三個字:我愛你!如果非要給這份愛加上一個期限,你希望是100年。因為100年后,你恐怕早已經(jīng)掛了!而現(xiàn)在,你的屏幕上出現(xiàn)了這篇你正在看的批處理教程,雖然不如你曾經(jīng)看的那篇經(jīng)典,但如果勉強還過的去。你會愛它嗎?時間會有50年那么長嗎?答案是:試試看吧。
批處理腳本中最重要的幾個命令,將在這一章詳細介紹,但是很遺憾,有些細節(jié)到現(xiàn)在我都沒掌握的很好,甚至還有些生分。如同還不太懂得愛一樣。但我一直都在努力,即使一直都沒有收獲。所以可能講的會比較籠統(tǒng),但我會告訴你方法,剩下的就是時間問題了,需要自己去磨練。讓我們共同努力吧。冰凍三尺非一日之寒,滴水穿石非一日之功。有些事情,比如學(xué)批處理,比如愛一個人,都是不能速成的,甚至還會有付出艱辛而收獲為甚微的情況。再次重申,看這篇教程的時候,一定要靜下心來,除非你已經(jīng)掌握了這篇教程的所有東西----但那也就不必看了,浪費時間!
7、if
接上一章,接著講if命令??偟膩碚f,if命令是一個表示判斷的命令,根據(jù)得出的每一個結(jié)果,它都可以對應(yīng)一個相應(yīng)的操作。關(guān)于它的三種用法,在這里分開講。
(1)、輸入判斷。還是用例五里面的那幾句吧:
if "%1"=="" goto usage if "%1"=="/?" goto usage if "%1"=="help" goto usage
這里判斷輸入的參數(shù)情況,如果參數(shù)為空(無參數(shù)),則跳轉(zhuǎn)到usage;如果參數(shù)為/?或help時(大家一般看一個命令的幫助,是不是輸入的/?或help呢,這里這么做只是為了讓這個腳本看起來更像一個真正的程序),也跳轉(zhuǎn)到usage。這里還可以用否定形式來表示“不等于”,例如:if not "%1"=="" goto usage,則表示如果輸入?yún)?shù)不為空就跳轉(zhuǎn)到usage(實際中這樣做就沒意義了,這里介紹用法,管不了那么多了,呵呵。)是不是很簡單?其實翻譯成中文體會一下就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。只是多一個not來表示否定而已。
(3)、結(jié)果判斷。還是拿例五開刀(沒想到自己寫的腳本,竟然用處這么大,呵呵):
masm %1.asm if errorlevel 1 pause & edit %1.asm link %1.obj
先對源代碼進行匯編,如果失敗則暫停顯示錯誤信息,并在按任意鍵后自動進入編輯界面;否則用link程序連接生成的obj文件。這里只介紹一下和if命令有關(guān)的地方,&命令后面會講到。這種用法是先判斷前一個命令執(zhí)行后的返回碼(也叫錯誤碼,DOS程序在運行完后都有返回碼),如果和定義的錯誤碼符合(這里定義的錯誤碼為1),則執(zhí)行相應(yīng)的操作(這里相應(yīng)的操作為pause & edit %1.asm部分)。
另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,代碼變?yōu)椋?/p>
masm %1.asm if not errorlevel 1 link %1.obj pause & edit %1.asm
看到本質(zhì)了吧?其實只是把結(jié)果判斷后所執(zhí)行的命令互換了一下,“if not errorlevel 1”和“if errorlevel 0”的效果是等效的,都表示上一句masm命令執(zhí)行成功(因為它是錯誤判斷,而且返回碼為0,0就表示否定,就是說這個錯誤不存在,就是說masm執(zhí)行成功)。這里是否加not,錯誤碼到底用0還是1,是值得考慮的兩個問題,一旦搭配不成功腳本就肯定出錯,所以一定要體會的很深刻才行。如何體會的深刻?練習(xí)!自己寫一個腳本,然后把有not和沒有not的情況,返回碼為0或1的情況分別寫進去執(zhí)行(怎么,嫌麻煩啊?排列組合算一下才四中情況你就嫌麻煩了?后面介紹管道命令和組合命令時還有更麻煩的呢!怕了?呵呵。),這樣從執(zhí)行的結(jié)果中就能很清楚的看出這兩種情況的區(qū)別。
這種用errorlevel結(jié)果判斷的用法是if命令最難的用法,但也恰恰是最有用的用法,如果你不會用errorlevel來判斷返回碼,則要達到相同的效果,必須用else來表示“否則”的操作,是比較麻煩的。以上代碼必須變成:
masm %1.asm if exist %1.obj link %1.obj else pause & edit %1.asm
關(guān)于if命令的這三種用法就say到這里,理解很簡單,但應(yīng)用時就不一定用的那么得心應(yīng)手,主要是熟練程度的問題??赡苡械呐笥延悬c驚訝,我怎么沒給出類似下面三行的用法介紹,是因為下面三行是if命令幫助里對它自身用法的解釋,任何人只要一個“if /?”就能看到,我沒有必要在這里多費口舌;更重要的原因,是我覺得這樣介紹的不清楚,看的人不一定看的懂,所以我采用上面自己對if命令的理解來介紹。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實際上可以互換(以為從本質(zhì)上講,這三種用法都是建立在判斷的基礎(chǔ)上的,哲學(xué)教我們學(xué)會透過現(xiàn)象看事物本質(zhì)?。?。有興趣的朋友可以自己研究一下。
IF [NOT] ERRORLEVEL number do command IF [NOT] string1==string2 do command IF [NOT] EXIST filename do command
8、call
學(xué)過匯編或C的朋友,肯定都知道call指令表示什么意思了,在這里它的意思其實也是一樣的。在批處理腳本中,call命令用來從一個批處理腳本中調(diào)用另一個批處理腳本??蠢耍J的三個腳本文件名分別為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 HACK.bat %%i %%j %%k
有沒有看出什么不對的地方?沒看出來?。繘]看出來就對了,其實就沒有不對的地方嘛,你怎么看的出來!從上面兩個腳本,你可以得到如下信息:1、腳本調(diào)用可以靈活運用,循環(huán)運用、重復(fù)運用。2、腳本調(diào)用可以使用參數(shù)!關(guān)于第一點就不多說了,聰明的你一看就應(yīng)該會,這里說一下第二點。
在start.bat中,10.bat后面跟了參數(shù)0,在執(zhí)行時的效果,其實就是把10.bat里的參數(shù)%1用0代替。在start.bat中,ipc.bat后面跟了參數(shù)ipcfind.txt(一個文件,也可以做參數(shù)),執(zhí)行時的效果,就是用ipc.bat中的每一行的三個變量(這里不懂沒關(guān)系,學(xué)過for命令后就懂了),對應(yīng)代換ipc.bat中的%%i、%%j和%%k。這里參數(shù)調(diào)用是非常靈活的,使用時需要好好體會。在初學(xué)期間,可以先學(xué)習(xí)只調(diào)用腳本,至于連腳本的參數(shù)一起使用的情況,在后面的學(xué)習(xí)中自然就會有比較深刻的理解,這是因為當你已經(jīng)可以靈活運用批處理腳本后,如何使代碼寫的更精簡更完美更高效就自然包括到了考慮的范圍,這時候你就會發(fā)現(xiàn)在調(diào)用腳本時直接加入?yún)?shù),可以使代碼效率加倍。By the way,上面的這幾個腳本,都是Bat.Worm.Muma病毒的一部分,在后面的教程里,大家將有機會見到這個病毒的真面目。
學(xué)習(xí)批處理!包你學(xué)會(三)
那是不是說,在同一個目錄下至少存在兩個批處理腳本文件(只有一個你調(diào)用誰?)?呵呵,注意了,這句話錯了!!只有一個照樣可以調(diào)用----調(diào)用自身!看例九(默認腳本文件名a.bat):
net send %1 This is a call example.
call a.bat
這兩句一結(jié)合,效果自然不怎么樣,因為只有一臺機器來發(fā)消息,誰怕誰啊?我給你來個禮尚往來!可如果有100臺機器同時執(zhí)行,而且每臺機器開10和窗口同時向一個目標機器發(fā)消息的話,呵呵。這里call a.bat的作用就是調(diào)用自身,執(zhí)行完前一句net send命令后再調(diào)用自身,達到了循環(huán)執(zhí)行的目的。
給出一個很有意思的腳本,有興趣的朋友可以實驗一下。例十(默認腳本文件名為a.bat):
call a.bat
一定要在DOS窗口下執(zhí)行,否則只會看到一個窗口一閃而過,看不到最后結(jié)果。等執(zhí)行完后,當腳本被執(zhí)行了1260次,別忘了想一下到底是為什么!愛情有時候跟這個腳本一樣,一旦陷入死循環(huán),最后的結(jié)果都是意想不到的。只是愛情,絕對不會等到被毫無理由的循環(huán)這么多次,也許在第三次時就出現(xiàn)了love is aborted的提示。
9、find
這是一個搜索命令,用來在文件中搜索特定字符串,通常也作為條件判斷的鋪墊程序(我怎么突然想起了這四個字?)。這個命令單獨使用的情況在批處理中是比較少見的,因為沒什么實際意義。還是借例三來說明:
@echo off netstat -a -n > a.txt type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!" del a.txt pause & exit
先用netstat命令檢查是否有冰河默認的端口7626在活動,并把結(jié)果保存到a.txt中。然后使用type命令列出a.txt中的內(nèi)容,再在列出的內(nèi)容中搜索字符串“7626” ,發(fā)現(xiàn)有的話則提示中了冰河,否則退出???,find命令其實就這么簡單,但有一點必須要注意到:如果不使用type命令列出a.txt中的內(nèi)容,而是直接使用find命令在a.txt中找“7626”(find a.txt "7626" && echo "Congratulations! You have infected GLACIER!"),就必須得給出這個a.txt的絕對路徑(我試過了,find并沒有默認路徑就是當前路徑的功能,必須手動指定。也許是我錯了,歡迎指正)。因為在find命令的幫助里有這么一句話:如果沒有指定路徑,find將搜索鍵入的或者由另一個命令產(chǎn)生的文字。這里的“另一個命令”自然就指的type命令了。
至于find命令的其他幾個參數(shù)如v、n、i等,有興趣的朋友自己去研究吧,這已經(jīng)屬于DOS學(xué)習(xí)的內(nèi)容了,這里就不做介紹。關(guān)于find命令和其他命令的一些更精妙的用法(有些簡直令人叫絕),后續(xù)的教程中將介紹,希望關(guān)注。
相關(guān)文章
BAT批處理實現(xiàn)Fibonacci函數(shù)
這篇文章主要介紹了BAT批處理實現(xiàn)Fibonacci函數(shù),本文直接給出實現(xiàn)代碼和使用示例,需要的朋友可以參考下2015-06-06在WINDOWS下dos與批處理中的命令cd /d %~dp0及其用途
這篇文章主要介紹了在WINDOWS下dos與批處理中的命令cd /d %~dp0及其用途,需要的朋友可以參考下2023-05-05批處理之家發(fā)現(xiàn)的用批處理實現(xiàn)的系統(tǒng)類應(yīng)用代碼
本批處理用到 WIMC FOR CALL GOTO 等大量的代碼 適合新手做研究2008-06-06