主頁 > 知識庫 > DOS 批處理命令For循環(huán)命令詳解

DOS 批處理命令For循環(huán)命令詳解

熱門標(biāo)簽:玉林市機(jī)器人外呼系統(tǒng)哪家好 電話機(jī)器人全國招商 如何申請400電話業(yè)務(wù)mm 智能打電話機(jī)器人收費(fèi) 呼倫貝爾外呼系統(tǒng) 雷霆電銷機(jī)器人怎么樣 如何弄地圖標(biāo)注 電話機(jī)器人產(chǎn)品怎么樣 清遠(yuǎn)百度地圖標(biāo)注店鋪位置

for命令是一種對一系列對象依次循環(huán)執(zhí)行同一個或多個命令的在命令行或批處理中運(yùn)行的命令,結(jié)合一些Windows管理中的程序后,其處理功能強(qiáng)大、應(yīng)用靈活方便程度令人刮目相看。但是,其幫助信息也因此復(fù)雜往往令初學(xué)者望而生畏,這里根據(jù)本人的學(xué)習(xí)理解,把其用法分解簡化,疏忽和錯誤也許在所難免。

基本格式

(這里寫的是在命令行里用的格式,如果是在批處理中,需要把其中%再多加個%形成%%):

for /參數(shù) %變量 in (集) do 命令

(注:上面除中文的以外,其余的是按它的格式要求書寫的,大小寫都行)
參數(shù):FOR分四種參數(shù) D L R F,并且有的參數(shù)還可附加另外的選項(xiàng)下面會分別介紹
變量:(記住如果是在批處理中使用for命令時,變量前的%需改為%%)這個變量名是由單個字母組成且區(qū)分大小寫(原幫助是這么說的,實(shí)際運(yùn)用中用單個數(shù)字作為變量名試過證明也可行),如%B和%b代表的是不同的變量。
     FOR命令會在每次循環(huán)中,把in (集)中讀取到的值賦于這個變量,以便其后的命令中引用。
集:由系列文件、字符串或由命令產(chǎn)生的內(nèi)容形成的集合(當(dāng)然可用通配符 * ?,還可引用環(huán)境變量),F(xiàn)OR命令是按一定順序和規(guī)律分次讀取集中內(nèi)容,賦值給變量,并執(zhí)行do后的命令,進(jìn)行循環(huán)下一輪,直至集中內(nèi)容讀取完畢,而括號是格式必須的(in到后面括號之間要有空格)。
命令:可以是任何合格的DOS命令或外部可被DOS調(diào)用的程序,且可采用括號把多條命令括起來,在一次循環(huán)中執(zhí)行。
附注:由于一些目錄或文件名可能會有空格,所以很多時候集里和命令里往往需要用英文引號括起來(但有時引號里的內(nèi)容可能會被認(rèn)為是字符串)表示是一整體,下面開始的有些例中為簡捷起見,忽略文件名或目錄名帶空格這種情況。
現(xiàn)在按參數(shù)分類舉例解釋其用法:

一、參數(shù) /d
for /d %%變量 in (集) do 命令
/d 參數(shù)是指定僅對目錄而不是文件執(zhí)行的for命令。
例1:
在命令行輸入(不是在批處理,之后不再解釋)
for /d %a in (c:\*.*) do echo %a
運(yùn)行會把C盤根目錄下的全部目錄分次顯示出來,而不顯示文件名
看起來有點(diǎn)亂,如果把命令提示回顯關(guān)閉就清晰了:
for /d %a in (c:\*.*) do @echo %a


二、參數(shù) /R
/R參數(shù)之后還可帶盤符及路徑
for /r 此處可以帶有路徑 %變量 in (集) do 命令
在/r 之后的那個路徑,指包含它之下的整個目錄樹(相當(dāng)于DOS命令tree里的范圍)中的所有目錄,如果僅為一個英文句點(diǎn) . ,是指當(dāng)前路徑下的目錄樹,如果省略了路徑則特指當(dāng)前目錄,而之后的in (集)則相當(dāng)于與前面每個目錄相配的文件集
這里按in(集)中有無通配符分兩種情況
1) in(集)中沒有通配符
指定的是單個文件或列舉的具體文件(多個文件名之間用分隔符分隔,如空格、逗號等)
例2

@echo of
for /r . %i in (abc.txt) do echo. > %i
echo on

注:這里for /r 后的路徑僅有一個 . 而后面每個循環(huán)中echo. > %i相當(dāng)于創(chuàng)建一個僅有一空行的文本文件,整體效果是在當(dāng)前目錄下包括子錄,每個目錄中建一個abc.txt。
例3 (放入批處理中)

@echo off
rem 顯示d:盤中所有文件名為file1和file2的列表
for /r d:\ %%h in (file1,file2) do if exist %%h echo %%h
pause


2) in(集)中含有通配符*或?
這種里面的do命令將處理前面 /r指定的目錄系列里每個含有in(集)中文件的項(xiàng),而不去理會不含有相配文件的那些目錄
例4:

@echo off
rem 刪除C盤中所有*.chk的文件
for /r c:\ %%h in (*.chk) do del /q %%h
pause


注:del /q 表示用安靜模式刪除(不需確認(rèn))

三、參數(shù) /L
for /L %%變量 in (起始值,每次增值,結(jié)束時的比較值) do 命令
(上面L也可用小寫,主要為了視覺上不與數(shù)字1混淆而沒用小寫)
(起始值,每次增值,結(jié)束時的比較值)相當(dāng)于一個等差數(shù)字序列,從“起始值”的數(shù)字開始,每次增加多少(也可設(shè)定為負(fù)數(shù))為“每次增值”,并與“結(jié)束時的比較值”比較,超出則退出for循環(huán)(也不執(zhí)行本輪后面的do 命令)
例如 (1,1,3) 將產(chǎn)生序列 (1 2 3);(1,2,9)將產(chǎn)生序列(1 3 5 7 9);(5,-1,1) 將產(chǎn)生序列 (5 4 3 2 1);(1,3,18)將產(chǎn)生序列(1 7 10 13 16)
例5

@echo off
::在D盤建立aa1~ aa5五個文件夾
for /L %%i in (1,1,5) do md d:\aa %%i
pause


注:在行首,單個冒號:接一名稱,是標(biāo)號行,對應(yīng)于批處理中g(shù)o后指向的位置,而雙冒號::一般是用來作注釋用,注釋在批處理中可以用rem加空格來表達(dá),二者稍有不同,rem注釋在未關(guān)閉命令回顯時會在屏幕顯示出來,而::則什么情況下都不會顯示。


四、參數(shù) /f
這個參數(shù)/f將會打開(集)里的文件,使for命令能處理文本文件的讀取和添加刪除替換等編輯性的操作,可謂功能強(qiáng)大,因此也相對復(fù)雜一些。
                                                 文件名-集    
for /f “選項(xiàng)” %變量 in ( “字符串”-集 ) do 命令
                                              ‘命令'-集
/f 后可以帶有幾種選項(xiàng),不帶選項(xiàng)當(dāng)然也是合格的格式,而帶有參數(shù)則必須以引號整體括起來,后面的集里主要由三種形式形成的,最終在for循環(huán)中的每一輪中會形成讀取一行字符串,來給指定的%變量、以及給由于選項(xiàng)中派生出附加變量賦值后,執(zhí)行do后面的命令
下面以例子來具體說明和逐步理解各分項(xiàng)的用法
例6
假定d:\abc.txt內(nèi)容如下:
姓名 性別 年齡 等-級
張三 男 36   A-1
李四 男 29   B-2
趙六 女 31   A-2


執(zhí)行如下命令:
for /f %c in (d:\abc.txt) do @echo %c
則屏幕上顯示:
姓名
張三
李四
趙六


解釋:這是for /r 在“%變量”前缺省參數(shù)選項(xiàng)時的情況,循環(huán)中每輪會默認(rèn)以空格為分隔,在打開的文件中逐行給字符串分段,又因?yàn)闆]給增添附加變量(即僅一個變量%c)則僅把第一段的字符賦給%c,再執(zhí)行 do后的命令,然后進(jìn)行循環(huán)的下一輪,并且默認(rèn)忽略空行
改一下:
for /f “skip=1 tokens=1,4 delims= ” %c in (d:\abc.txt) do @echo %c %d
顯示為:
張三 A-1
李四 B-2
趙六 A-2


解:
skip=1 表示文本開始忽略的行數(shù)為1 ——忽略幾行
    delims= 在一行中,用什么單個符號(可以有多字符組合,之間也不能加空格,被理解為多項(xiàng)單個字符,如要空格符須放最后)來分隔字符串作為讀取賦值的單元(形成一段),本例中等號后是空的表示僅用空格來分隔?!檬裁吹秮砬蟹?br />     tokens=1,4 這個等號后的數(shù)字表示依次取第幾個被分隔的字符串段,來分別賦給%變量及順序附加的變量,本例取第1個段賦給%c,第4個段賦給c后的一個變量也就是賦給%d,并且,可以寫成tokens=1,2,5-7 或tokens=1,2,3* 或tokens=1,2,5,7 分別表示取第1,2,5,6,7(依次賦給%c, %d, %e, %,f, %g共5個變量)、1,2,3及3后的所有段(要賦給3個變量)、1,2,5,7(要賦給4個變量),tokens=后的數(shù)字號可以不按順序,但書寫的順序與分配給變量的順序是對應(yīng)的,這是賦值,至于之后do命令中用不用是另一回事。換句話 --——最多只需取哪幾段
in (變量) 中的那個變量,代表起始的一個變量名,按tokens中定義的總個數(shù)來擴(kuò)充附加變量名,如總個數(shù)為3,則%c 就附加%d和%e ,要是%C就附加%D%E… 本例中tokens=1,4僅需兩個,起始的是in () 括號中的%c 則每行中第一段賦給%c,第4段賦給變量%d
以第二行(第一行被skip=1跳過了)為例,在 “張三 男 36 A-1 ” 中(正好也是用的空格分隔)共被空格之刀切為五段,只要第1、4,即張三賦給%c, A-1賦給%d,執(zhí)行@echo %c %d然后下一輪…而空行照舊被省去了。


再稍改一下:


for /f “skip=1 tokens=4,1 delims=- “ %c in (d:\abc.txt) do @echo %c %d


則顯示為:
A 張三
B 李四
A 趙六


例7
假定d:\aa.txt內(nèi)容如下:


Volume in drive D is MYDA
Volume Serial Number is C35D-8998


Directory of D:tmp


09/25/2001 10:40 AM 11,235 yg0925.txt
11/12/2001 04:29 pM 795 buple.txt
04/11/2002 04:18 AM 2,043 vitn.txt
3File(s) 12,673 bytes
0 Dir(s) 5,020,200,655 bytes free


在命令行輸入:
for /f "skip=5 tokens=5" %a in (d:\aa.txt) do @echo %a
會顯示:
yg0925.txt
buple.txt
vitn.txt
free
    本意想把文件里列出的文件顯示出來(當(dāng)然也可以換成對文件進(jìn)行其他命令操作)
通過skip=5 忽略掉前5行,默認(rèn)以空格分隔后tokens=5取每行第五段字符就順利地把文件名賦給變量%a,美中不足最后一行取了個不是文件名的(當(dāng)然可用其他方法處理這個多余的只是for/f中沒提供忽略最后幾行的格式),而倒數(shù)第二行則無第五段。
顯然例中aa.txt里的內(nèi)容是某次執(zhí)行dir命令后的內(nèi)容。它可用類似命令:
dir > d:\aa.txt來建立
   題外話,如果在dir中加入合適的參數(shù)/b,就可以回避多余的部分,還可加入/ad只顯示目錄,加入/a-d只顯示文件等
那么,我們完全可以直接書寫命令放入in后的(‘命令'-集)中
for /f "skip=5 tokens=5 " %a in ('dir') do @echo %a


效果一樣。
注:命令集需用單引號括起來以表示不是文件集,如用雙引號括起來則表示是字符串集,本例是為了說明for命令的用法,真正有這種用途也愿意用前面“題外話”的方法。如果你在執(zhí)行本例后什么也沒顯示,你需要先用集里的命令先執(zhí)行一次,看它顯示的格式,也許需要把tokens=5 改成tokens=4 或許還應(yīng)當(dāng)給dir加上參數(shù) /a-d以回避顯示出目錄。
如果集里是由多個文件組成,那么處理完一個文件后又處理完又去處理另一個文件,每個文件行數(shù)不同循環(huán)次數(shù)(do命令的次數(shù))也將因此不同。
如果集里是由命令產(chǎn)生的系統(tǒng),那么你必須首先熟悉該命令執(zhí)行后會產(chǎn)生怎樣效果的字符系統(tǒng),才能正確安排后面的do命令


畫龍點(diǎn)睛:無論in后的集是哪種形式,for/f 都最終分解為字符串,按需要是否“忽略幾行”(skip=)、“用什么刀來切分”(delims= )、“最多只需取哪幾段”(tokens=)將集里形成的字符串,逐行地分段賦給%或%%后的變量及可能順延擴(kuò)展出的變量,以執(zhí)行do后的命令,每一行即為一輪循環(huán)。這里沒完整說明全部參數(shù),請?jiān)诿钚杏胒or/?查看。(下面的斜體字是復(fù)制的幫助里的內(nèi)容)
例如:
對于帶有空格的文件名,您需要用雙引號將文件名括起來。為了用這種方式來使用雙引號,您還需要使用 usebackq 選項(xiàng),否則,雙引號會被理解成是用作定義某個要分析的字符串的。——換句話說,帶有usebackq(放在for /f 之后的引號里)參數(shù)時 in ()里用雙引號表示的仍是文件名。
還有一個選項(xiàng)eol= :前面所說skip=是表示忽略開始的幾行,其實(shí)默認(rèn)狀況還忽略所有分號“ ; ”開始的行,如果你想不忽略分號開始的行,或者想忽略自己指定一字符開始的行就可以在for /f 之后那引號參數(shù)里使用eol=你自己定義的字符,但它不像delims=的那樣可定義多個,只允許定義一個。


另一花樣:可以用 %~ 操作符將文件名分離成文件名、擴(kuò)展名、盤符等獨(dú)立部分 ,請看for/?中的解釋(其中示例的變量為%I):
另外,F(xiàn)OR 變量參照的替換已被增強(qiáng)。您現(xiàn)在可以使用下列選項(xiàng)語法:


~I - 刪除任何引號("),擴(kuò)充 %I
%~fI - 將 %I 擴(kuò)充到一個完全合格的路徑名
%~dI - 僅將 %I 擴(kuò)充到一個驅(qū)動器號
%~pI - 僅將 %I 擴(kuò)充到一個路徑
%~nI - 僅將 %I 擴(kuò)充到一個文件名
%~xI - 僅將 %I 擴(kuò)充到一個文件擴(kuò)展名
%~sI - 擴(kuò)充的路徑只含有短名
%~aI - 將 %I 擴(kuò)充到文件的文件屬性
%~tI - 將 %I 擴(kuò)充到文件的日期/時間
%~zI - 將 %I 擴(kuò)充到文件的大小
%~$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)充
到找到的第一個完全合格的名稱。如果環(huán)境變量名
未被定義,或者沒有找到文件,此組合鍵會擴(kuò)充到空字符串


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


%~dpI - 僅將 %I 擴(kuò)充到一個驅(qū)動器號和路徑
%~nxI - 僅將 %I 擴(kuò)充到一個文件名和擴(kuò)展名
%~fsI - 僅將 %I 擴(kuò)充到一個帶有短名的完整路徑名
%~dp$PATH:I - 查找列在路徑環(huán)境變量的目錄,并將 %I 擴(kuò)充
到找到的第一個驅(qū)動器號和路徑。
%~ftzaI - 將 %I 擴(kuò)充到類似輸出線路的 DIR


簡記:凡是 %~ 打頭的操作符,都是文件名或環(huán)境變量的分離操作。而每項(xiàng)要想運(yùn)用自如,則需要付出辛勤的練習(xí)。


練習(xí):(我偷點(diǎn)懶,自己不作了...)
遍歷C、D盤,查找已知文件名(接收鍵盤輸入),把其存放位置、時間,記錄到D:\mynote.txt 記錄格式如:


xx年xx月xx日 經(jīng)查找在C盤、D盤的xx文件情況如下:
   時間             位置
。。。。。 。。。。。。
。。。。。 。。。。。。
。。。。。 。。。。。。

。
。


提示:可能用到的DOS命令、變量、參數(shù): echo、set 、set/p 、%date%、%~    >、>> 


總結(jié)及提示:
for 命令的實(shí)際用法基本上已終結(jié),但是僅此是不能寫出強(qiáng)大功能的批處理的,它只是一條DOS命令,需要熟練一些其他的DOS命令和Windows系統(tǒng)提供的命令,組合運(yùn)用,才能充分發(fā)揮其強(qiáng)大、實(shí)用的功能,使得一些復(fù)雜事情,處理起來意想不到的簡潔方便。

附:常見在批處理for命令中需要的一個的命令或者叫環(huán)境設(shè)置:
for命令實(shí)際上是會作循環(huán),如果在每輪的命令中改變某環(huán)境變量值,在默認(rèn)狀態(tài),一條for命令用%環(huán)境變量%只取一次值的,那么下輪循環(huán)中再用時還是改變前的值(包括do后面帶有括號里的多條命令的執(zhí)行期間),就沒達(dá)到預(yù)期目的,為此,引入下面命令:
setlocal enabledelayedexpansion
開始批處理文件中環(huán)境改動的本地化操作,并啟動延緩環(huán)境變量擴(kuò)展。在執(zhí)行SETLOCAL 達(dá)到批處理文件結(jié)尾時,對于該批處理文件的每個尚未執(zhí)行的 setlocal 命令,都會有一個隱含的 endlocal 被執(zhí)行。
在取變量值時,用!變量名!可以動態(tài)取值,延遲環(huán)境變量擴(kuò)充允許您使用一個不同的字符(驚嘆號)在執(zhí)行時間擴(kuò)充環(huán)境變量。這個用法實(shí)際是屬于在批處理中所有復(fù)合型命令都需要注意的。如果批處理結(jié)束后不希望將改變的環(huán)境保留,建議總是加上setlocal 。
要是結(jié)合一些其他復(fù)雜些的有關(guān)系統(tǒng)的、網(wǎng)絡(luò)的命令(如wmic、net)進(jìn)來,那才是方顯FOR英雄本色,比如遍歷本地磁盤可以用命令:wmic logicaldisk where "drivetype=3" get name 顯然要在所有磁盤里查找某文件并作相應(yīng)操作就很容易了,用好for命令也是需要其他命令和計(jì)算機(jī)基礎(chǔ)配合的。呵呵,本人水平有限,寫的只是低級層次的...但愿能對有緣來這里看的初學(xué)DOS的FOR命令者有所幫助。

您可能感興趣的文章:
  • 使用批處理實(shí)現(xiàn)啟動和停止服務(wù)的代碼分析(net startnet stop)
  • 全盤刪除所有文件夾下的_desktop.ini的批處理bat文件
  • 一鍵清除_desktop.ini文件的批處理文件
  • 利用bat批處理程序通過DOS命令行刪除所有的空文件夾的方法
  • bat命令批處理判斷32位還是64位系統(tǒng)的多種方法
  • bat 批處理 for 命令快速入門
  • 批處理入門手冊之批處理常用DOS命令篇(find findstr)
  • 批處理入門手冊之批處理常用DOS命令篇(md、rd、ren、move)
  • 批處理入門手冊之批處理常用DOS命令篇(attrib、del、copy、xcopy)
  • 批處理入門手冊之批處理常用DOS命令篇(echo、rem、cd、dir)
  • 終極dos批處理for循環(huán)命令詳解
  • Windows命令行bat批處理延遲sleep方法(批處理延時)
  • 批處理模式下運(yùn)行 top 命令的方法

標(biāo)簽:白銀 樂山 三門峽 株洲 公主嶺 臺州 蕪湖 江西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《DOS 批處理命令For循環(huán)命令詳解》,本文關(guān)鍵詞  DOS,批處理,命令,For,循環(huán),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《DOS 批處理命令For循環(huán)命令詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于DOS 批處理命令For循環(huán)命令詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章