DOS批處理高級教程:第二章 DOS循環(huán)for命令詳解
講FOR之前呢,咋先告訴各位新手朋友,如果你有什么命令不懂,直接在CMD下面輸入:
name /? 這樣的格式來看系統(tǒng)給出的幫助文件,比如for /? 就會把FOR命令的幫助全部顯示出來!當然許多菜鳥都看不懂....所以才會有那么多批處理文章!!!!俺也照顧菜鳥,把FOR命令用我自己的方式說明下!
正式開始:
一,、基本格式
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個單一字母表示可替換的參數(shù),。 (set) 指定一個或一組文件??梢允褂猛ㄅ浞?。 command 指定對每個文件執(zhí)行的命令。 command-parameters 為特定命令指定參數(shù)或命令行開關(guān),。
參數(shù):FOR有4個參數(shù) /d /l /r /f 他們的作用我在下面用例子解釋 現(xiàn)在開始講每個參數(shù)的意思
二,、參數(shù) /d
FOR /D %%variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,,而不與文件名匹配。
如果 Set (也就是我上面寫的 "相關(guān)文件或命令") 包含通配符(* 和 ?),將對與 Set 相匹配的每個目錄(而不是指定目錄中的文件組)執(zhí)行指定的 Command,。
這個參數(shù)主要用于目錄搜索,不會搜索文件,看這樣的例子
- @echo off
- for /d %%i in (c:\*) do echo %%i
- pause
復(fù)制代碼 運行會把C盤根目錄下的全部目錄名字打印出來,而文件名字一個也不顯示!
在來一個,比如我們要把當前路徑下文件夾的名字只有1-3個字母的打出來
- @echo off
- for /d %%i in (???) do echo %%i
- pause
復(fù)制代碼 這樣的話如果你當前目錄下有目錄名字只有1-3個字母的,就會顯示出來,沒有就不顯示了
這里解釋下*號和?號的作用,*號表示任意N個字符,而?號只表示任意一個字符
知道作用了,給大家個思考題目!
- @echo off
- for /d %%i in (window?) do echo %%i
- pause
復(fù)制代碼 保存到C盤下執(zhí)行,會顯示什么呢?自己看吧! 顯示:windows /D參數(shù)只能顯示當前目錄下的目錄名字,這個大家要注意!
三,、參數(shù) /R
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的FOR 語句,。如果在 /R 后沒有指定目錄,,則使用當前目錄。如果集僅為一個單點(.)字符,,則枚舉該目錄樹,。
遞歸
上面我們知道,/D只能顯示當前路徑下的目錄名字,那么現(xiàn)在這個/R也是和目錄有關(guān),他能干嘛呢?放心他比/D強大多了! 他可以把當前或者你指定路徑下的文件名字全部讀取,注意是文件名字,有什么用看例子!
請注意2點:
- set中的文件名如果含有通配符(?或*),,則列舉/R參數(shù)指定的目錄及其下面的所用子目錄中與set相符合的所有文件,,無相符文件的目錄則不列舉。
- 相反,,如果set中為具體文件名,,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的所有子目錄),,而不管set中的指定文件是否存在,。這與前面所說的單點(.)枚舉目錄樹是一個道理,單點代表當前目錄,,也可視為一個文件,。
例:
- @echo off
- for /r c:\ %%i in (*.exe) do echo %%i
- pause
復(fù)制代碼 咱們把這個BAT保存到D盤隨便哪里然后執(zhí)行,我會就會看到,他把C盤根目錄,和每個目錄的子目錄下面全部的EXE文件都列出來了!!!!
例:
- @echo off
- for /r %%i in (*.exe) do @echo %%i
- pause
復(fù)制代碼 參數(shù)不一樣了吧!這個命令前面沒加那個C:\也就是搜索路徑,這樣他就會以當前目錄為搜索路徑,比如你這個BAT你把他放在d:\test目錄下執(zhí)行,那么他就會把D:\test目錄和他下面的子目錄的全部EXE文件列出來!!!
例:
- @echo off
- for /r c:\ %%i in (boot.ini) do echo %%i
- pause
復(fù)制代碼 運行本例發(fā)現(xiàn)枚舉了c盤所有目錄,為了只列舉boot.ini存在的目錄,,可改成下面這樣:
- @echo off
- for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
- pause
復(fù)制代碼 用這條命令搜索文件真不錯,。。,。,。。,。
這個參數(shù)大家應(yīng)該理解了吧!還是滿好玩的命令!
四,、參數(shù) /L
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結(jié)束的一個數(shù)字序列。因此,,(1,1,5) 將產(chǎn)生序列 1 2 3 4 5,,(5,-1,1) 將產(chǎn)生序列 (5 4 3 2 1)。
使用迭代變量設(shè)置起始值 (Start#),,然后逐步執(zhí)行一組范圍的值,,直到該值超過所設(shè)置的終止值 (End#)。/L 將通過對 Start# 與 End# 進行比較來執(zhí)行迭代變量,。如果 Start# 小于 End#,,就會執(zhí)行該命令,。如果迭代變量超過 End#,則命令解釋程序退出此循環(huán),。還可以使用負的 Step# 以遞減數(shù)值的方式逐步執(zhí)行此范圍內(nèi)的值,。例如,(1,1,5) 生成序列 1 2 3 4 5,,而 (5,-1,1) 則生成序列 (5 4 3 2 1),。語法是:
看著這說明有點暈吧!咱們看例子就不暈了!
- @echo off
- for /l %%i in (1,1,5) do @echo %%i
- pause
復(fù)制代碼 保存執(zhí)行看效果,他會打印從1 2 3 4 5 這樣5個數(shù)字(1,1,5)這個參數(shù)也就是表示從1開始每次加1直到5終止!
等會暈,就打印個數(shù)字有P用...好的滿足大家,看這個例子
- @echo off
- for /l %%i in (1,1,5) do start cmd
- pause
復(fù)制代碼
執(zhí)行后是不是嚇了一跳,怎么多了5個CMD窗口,呵呵!如果把那個 (1,1,5)改成 (1,1,65535)會有什么結(jié)果,我先告訴大家,會打開65535個CMD窗口....這么多你不死機算你強!
當然我們也可以把那個start cmd改成md %%i 這樣就會建立指定個目錄了!!!名字為1-65535
看完這個被我賦予破壞性質(zhì)的參數(shù)后,我們來看最后一個參數(shù)
五、參數(shù) /F
\迭代及文件解析
使用文件解析來處理命令輸出,、字符串及文件內(nèi)容,。使用迭代變量定義要檢查的內(nèi)容或字符串,并使用各種options選項進一步修改解析方式,。使用options令牌選項指定哪些令牌應(yīng)該作為迭代變量傳遞,。請注意:在沒有使用令牌選項時,/F 將只檢查第一個令牌,。
文件解析過程包括讀取輸出,、字符串或文件內(nèi)容,將其分成獨立的文本行以及再將每行解析成零個或更多個令牌,。然后通過設(shè)置為令牌的迭代變量值,,調(diào)用 for 循環(huán)。默認情況下,,/F 傳遞每個文件每一行的第一個空白分隔符號,。跳過空行。
詳細的幫助格式為:
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %%variable IN ("string") DO command [command-parameters] FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
帶引號的字符串"options"包括一個或多個指定不同解析選項的關(guān)鍵字,。這些關(guān)鍵字為:
eol=c - 指一個行注釋字符的結(jié)尾(就一個) skip=n - 指在文件開始時忽略的行數(shù),。 delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集,。 tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身,。這會導(dǎo)致額外變量名稱的分配。m-n格式為一個范圍,。通過 nth 符號指定 mth,。如果符號字符串中的最后一個字符星號,那么額外的變量將在最后一個符號解析之后分配并接受行的保留文本,。經(jīng)測試,,該參數(shù)最多只能區(qū)分31個字段。
usebackq - 使用后引號(鍵盤上數(shù)字1左面的那個鍵`),。 未使用參數(shù)usebackq時:file-set表示文件,,但不能含有空格 雙引號表示字符串,即"string" 單引號表示執(zhí)行命令,,即'command' 使用參數(shù)usebackq時:file-set和"file-set"都表示文件 當文件路徑或名稱中有空格時,,就可以用雙引號括起來 單引號表示字符串,,即'string' 后引號表示命令執(zhí)行,即`command`
以上是用for /?命令獲得的幫助信息,,直接復(fù)制過來的,。 暈慘了!我這就舉個例子幫助大家來理解這些參數(shù)! 在For命令語句的參數(shù)F中,最難理解的就是Delims和Tokens兩個選項,,本文簡單的做一個比較和總結(jié)。 “For /f”常用來解析文本,,讀取字符串,。分工上,delims負責切分字符串,,而tokens負責提取字符串,。如果把字符串當作蛋糕,Delims像刀子,,用來切蛋糕,,tokens像叉子,用來取切好的蛋糕,。下面我們用實例來進行理解,。 把以下內(nèi)容保存為文本文件“歌曲列表.txt”,注意擴展名為“.txt”: 序號,、歌手名-歌曲名.后綴名 1,、饒?zhí)炝?玫瑰愛人.wma 2、高一首-我不愿錯過.mp3 3,、黃凱芹-傷感的戀人.MP3 4,、黃燦-黃玫瑰.lrc 5、黎姿-如此這般的愛情故事.mp3 代碼1:顯示全部內(nèi)容 @echo off for /f %%i in (歌曲列表.txt) do echo %%i pause>nul 運行結(jié)果: 序號,、歌手名-歌曲名.后綴名 1,、饒?zhí)炝?玫瑰愛人.wma 2、高一首-我不愿錯過.mp3 3,、黃凱芹-傷感的戀人.MP3 4,、黃燦-黃玫瑰.lrc 5、黎姿-如此這般的愛情故事.mp3 講解: 如果不使用參數(shù)“/f”,,運行結(jié)果只顯示括號里的文字字符“歌曲列表.txt”,,而不能讀取文本文件“歌曲列表.txt”中的內(nèi)容??梢?,“/f”是解析文本字符串的好工具。 一,、delims 假如只要序號,,不要歌手名,、歌曲名和后綴名,如何辦到,? 代碼2:默認提取第一列 @echo off for /f "delims=,、" %%i in (歌曲列表.txt) do echo %%i pause>nul 運行結(jié)果: 序號 1 2 3 4 5 講解: "delims=、"表示定義頓號“,、”為分隔符,,并用該分隔符“、”切分文本字符串,。字符串就是“歌曲列表.txt”里的內(nèi)容,,也就是文件里的文字和標點符號。 該頓號是原文中就有的,。除了頓號“,、”,原文中還有減號“-”和點號“.”,,因此你也可以用它們來做分隔符,。 代碼3:用減號“-”做分隔符 @echo off for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i pause>nul 運行結(jié)果: 序號、歌手名 1,、饒?zhí)炝? 2,、高一首 3、黃凱芹 4,、黃燦 5,、黎姿 講解: 因為,當減號“-”被用做分隔符時,,每行內(nèi)容被減號“-”分隔成前后兩半,,默認只顯示前半部分,而后半部分連同分隔符減號“-”都被忽略(省略)了,。 代碼4:用點號“.”做分隔符 @echo off for /f "delims=." %%i in (歌曲列表.txt) do echo %%i pause>nul 運行結(jié)果: 序號,、歌手名-歌曲名 1、饒?zhí)炝?玫瑰愛人 2,、高一首-我不愿錯過 3,、黃凱芹-傷感的戀人 4、黃燦-黃玫瑰 5,、黎姿-如此這般的愛情故事 講解: 默認情況下,,單純使用delims而不用tokens時,只顯示第一個分隔符前的內(nèi)容,,第一個分隔符和第一個分隔符后面的內(nèi)容將被忽略,。 代碼5:定義多個分隔符 @echo off for /f "delims=、-." %%i in (歌曲列表.txt) do echo %%i pause>nul 運行結(jié)果: 序號 1 2 3 4 5 講解: 原因是,,當定義頓號“,、”,、減號“-”和點號“.”三個標點符號為分隔符后,原文被分隔成四個部分,。 如第二行“1,、饒?zhí)炝?玫瑰愛人.wma”將被分隔成“1”、“饒?zhí)炝痢?、“玫瑰愛人”和“wma” 四個部分,。 從第一行到最后一行,每行的每個部分對應(yīng)下來相當于一個豎列,。因此,,原文就有“序號”、“歌手名”,、“歌曲名”、“后綴名”四列,。 一般情況下,,只讀取第一列的內(nèi)容。后面的內(nèi)容需要用tokens選項提取,。 詳細出處參考:http://www.jb51.net/article/17927.htm
(四)tokens=x,y,m-n 提取列
格式:
FOR /F "tokens=x,y,m-n" %%I IN (Command1) DO Command2
用法:
一句話總結(jié):提取列,。
通俗講,共同提取每一行的第m小節(jié)的內(nèi)容,。
因此,,可以用該命令來指定提取文本信息。
tokens=有時表示提取全部,。
tokens=m表示提取第m列,。
tokens=m,n表示提取第m列和第n列。
tokens=m-n表示提取第m列至第n列,。
Tokens=*表示刪除每行前面的空格,。忽略行首的所有空格。
tokens=m*提取第m列以后的所有字符,,星號表示剩余的字符,。
tokens=m,*提取第m列以后的所有字符,星號表示剩余的字符,。
輸出變量的個數(shù)由定義了的tokens決定,。
在 FOR 語句中顯式聲明 %%i。使用tokens= 隱式聲明%%j 和%%k,。只要不會引起試圖聲明高于字母“z”或“Z”的某個變量,,則使用tokens= 可以指定最多 26 個輸出變量。
接著前面的例子“靜夜思”,。
如果我要提取第三小節(jié)“舉頭望明月”,,如何做到,?
@echo off
for /f "delims=, tokens=3" %%i in (靜夜思.txt) do echo %%i
pause>nul
講解:
首先用delims=,,表示命令要用逗號作為詩句的分隔符將四句分成四小節(jié),。然后用tokens=3提取第三小節(jié),即“舉頭望明月”了,。
delims=和tokens=共用一對雙引號,,如果單獨用雙引號,則FOR命令返回的只能是它們之中的一個,。因為在第一節(jié)說過,,F(xiàn)OR是逐一讀取命令的,將delims和tokens分開后,,F(xiàn)OR只能一次讀取一個,,不能一次全部讀取。
注意:
Tokens常和delims一起使用,。
首先,,一行內(nèi)容被delims用分割符號如逗號等分隔成許多小段或小節(jié)。
然后,,tokens才能提取每行之間對應(yīng)的這些小段或小節(jié)——列,。具體看下面例子。
例:提取前面例子文本“a.txt”中每行的第三段內(nèi)容“ccc”,、“kkk”,、“ggg”、“考試”,。
@echo off
for /f "skip=1 delims=,,, tokens=3" %%i in (a.txt) do echo %%i
pause>nul
注意:為什么kkk不出現(xiàn)呢?
例:如何屏蔽掉文本“a.txt”中的標點符號,?
@echo off
for /f "skip=1delims=,,, tokens=1-4" %%i in (a.txt) do echo %%i %%j %%k %%l
pause>nul
講解:
%%i %%j %%k %%l是輸出變量,它的個數(shù)由tokens后面的(m-n)決定,,一般有(n-m+1)個,,但不能超過Z。
并且%%后面的字母存在先后順序,,%%a %%b是順向,,倒過來則是逆向的。
代行號的tokens=m*,,星號表示m后面的所有剩余的列,。
例:
for /f "tokens=*" %%i in (a.txt) do echo %%i
講解:
沒有指定具體的列,"tokens=*"將提取全部列,后面只需一個輸出變量%%i,。
例:
for /f "tokens=2*" %%i in (a.txt) do echo %%i %%j
講解:
"tokens=2*"提取第二列以后的所有字符,,星號表示剩余的字符。輸出變量%%i對應(yīng)于2的輸入變量,,%%j對應(yīng)于星號的輸入變量,。
注意:
這里沒有使用delisms但卻以空格分隔了,是因為FOR默認空格是做分隔符的,。
例:屏蔽掉“易經(jīng).txt”中的標點符號:
@echo off
for /f "tokens=1-5 delims=:,," %%a in (易經(jīng).txt) do echo %%a %%b %%c %%d %%e
pause>nul
講解:
當delims定義了兩個分隔符“:”和“,”時,,提取列要用到tokens,。
有五個列,所以tokens要定義提取第一列至第五列,,即1-5,,相應(yīng)地,后面需要五個輸出顯示變量%%a %%b %%c %%d %%e,。你也可以這樣修改,,避免過多的變量符號【補充?】
你也可以將最后多余的句號定義為分隔符“delims=:,,?!睂⑵淦帘蔚?。
練習:
1、 請簡單說說tokens的作用
2,、 Tokens=1,3-5后面的輸出變量需要多少個,?
3、 請使用tokens提取下面網(wǎng)頁的標題《硬盤知識及故障大總匯(頁 2)》:
手機,3G手機,智能手機,手機電影,手機軟件,手機游戲,鈴聲,主題,圖片,電子書,手機維修,手機大全,手機報價,下載,智能手機的測評,使用心得 硬盤知識及故障大總匯(頁 2) - 電腦技術(shù)交流區(qū) - 3g365智能手機論壇 - powered by Discuz! Archiver.mht
"delims=" 的含義是取消默認的分隔符,,所以會把行上的內(nèi)容照搬下來,,而 "tokens=*" 表示獲取行上的所有內(nèi)容,但是會忽略行首的所有空格,。 - 比較以下兩段代碼的執(zhí)行結(jié)果差異: 1,、 @echo off for /f "delims=" %%i in (test.txt) do echo /%%i/ pause 2、 @echo off for /f "tokens=*" %%i in (test.txt) do echo /%%i/ pause
test.txt 的內(nèi)容為: abc ,。行首有若干空格,。 看到有什么差別了嗎?
原因:"delims=" 的含義是取消默認的分隔符,,所以會把行上的內(nèi)容照搬下來,,而 "tokens=*" 表示獲取行上的所有內(nèi)容,但是會忽略行首的所有空格。 -
For命令例1:****************************************
- @echo off
- rem 首先建立臨時文件test.txt
- echo ;注釋行,這是臨時文件,用完刪除 >test.txt
- echo 11段 12段 13段 14段 15段 16段 >>test.txt
- echo 21段,22段,23段,24段,25段,26段 >>test.txt
- echo 31段-32段-33段-34段-35段-36段 >>test.txt
- FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k
- Pause
- Del test.txt
復(fù)制代碼 運行顯示結(jié)果:
11段 13段 14段 15段 16段 21段 23段 24段,25段,26段 31段 33段 34段-35段-36段 請按任意鍵繼續(xù). . .
為什么會這樣?我來解釋: eol=; 分號開頭的行為注釋行 tokens=1,3* 將每行第1段,第3段和剩余字段分別賦予變量%%i,,%%j,,%%k delims=,- (減號后有一空格)以逗號減號和空格為分隔符,空格必須放在最后
For命令例2:****************************************
- @echo off
- FOR /F "eol= delims=" %%i in (test.txt) do echo %%i
- Pause
復(fù)制代碼 運行將顯示test.txt全部內(nèi)容,,包括注釋行,,不解釋了哈。
For命令例3:****************************************
另外/F參數(shù)還可以以輸出命令的結(jié)果看這個例子
- @echo off
- FOR /F "delims=" %%i in ('net user') do @echo %%i
- pause
復(fù)制代碼 這樣你本機全部賬號名字就出來了把擴號內(nèi)的內(nèi)容用兩個單引號引起來就表示那個當命令執(zhí)行,FOR會返回命令的每行結(jié)果,加那個"delims=" 是為了讓我空格的行能整行顯示出來,不加就只顯示空格左邊一列!
基本上講完了FOR的基本用法了...如果你看過FOR的系統(tǒng)幫助,你會發(fā)現(xiàn)他下面還有一些特定義的變量,這些我先不講.大家因該都累了吧!你不累我累啊....
所謂文武之道,,一張一弛,,現(xiàn)休息一下。 |