批處理 bat中的for命令的作用

for幫助文檔

對一組文件中的每一個文件執行某個特定命令。 

FOR %variable IN (set) DO command [command-parameters] 

%variable 指定一個單一字母可替換的參數。 
(set) 指定一個或一組文件。可以使用通配符。 
command 指定對每個文件執行的命令。 
command-parameters 
爲特定命令指定參數或命令行開關。 

在批處理程序中使用 FOR 命令時,指定變量請使用 %%variable 
而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同於 %I. 

如果命令擴展被啓用,下列額外的 FOR 命令格式會受到 
支持: 

FOR /D %variable IN (set) DO command [command-parameters] 

如果集中包含通配符,則指定與目錄名匹配,而不與文件 
名匹配。 

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 

檢查以 [drive:]path 爲根的目錄樹,指向每個目錄中的 
FOR 語句。如果在 /R 後沒有指定目錄,則使用當前 
目錄。如果集僅爲一個單點(.)字符,則枚舉該目錄樹。 

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 (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] 

或者,如果有 usebackq 選項: 

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] 

filenameset 爲一個或多個文件名。繼續到 filenameset 中的 
下一個文件之前,每份文件都已被打開、讀取並經過處理。 
處理包括讀取文件,將其分成一行行的文字,然後將每行 
解析成零或更多的符號。然後用已找到的符號字符串變量值 
調用 For 循環。以默認方式,/F 通過每個文件的每一行中分開 
的第一個空白符號。跳過空白行。您可通過指定可選 "options" 
參數替代默認解析操作。這個帶引號的字符串包括一個或多個 
指定不同解析選項的關鍵字。這些關鍵字爲: 

eol=c - 指一個行註釋字符的結尾(就一個) 
skip=n - 指在文件開始時忽略的行數。 
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的 
默認分隔符集。 
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代 
的 for 本身。這會導致額外變量名稱的分配。m-n 
格式爲一個範圍。通過 nth 符號指定 mth。如果 
符號字符串中的最後一個字符星號, 
那麼額外的變量將在最後一個符號解析之後 
分配並接受行的保留文本。 
usebackq - 指定新語法已在下類情況中使用: 
在作爲命令執行一個後引號的字符串並且一個單 
引號字符爲文字字符串命令並允許在 filenameset 
中使用雙引號擴起文件名稱。 

某些範例可能有助: 

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 

會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將 
每行中的第二個和第三個符號傳遞給 for 程序體;用逗號和/或 
空格定界符號。請注意,這個 for 程序體的語句引用 %i 來 
取得第二個符號,引用 %j 來取得第三個符號,引用 %k 
來取得第三個符號後的所有剩餘符號。對於帶有空格的文件 
名,您需要用雙引號將文件名括起來。爲了用這種方式來使 
用雙引號,您還需要使用 usebackq 選項,否則,雙引號會 
被理解成是用作定義某個要分析的字符串的。 

%i 專門在 for 語句中得到說明,%j 和 %k 是通過 
tokens= 選項專門得到說明的。您可以通過 tokens= 一行 
指定最多 26 個符號,只要不試圖說明一個高於字母 'z' 或 
'Z' 的變量。請記住,FOR 變量是單一字母、分大小寫和全局的;而且, 
同時不能有 52 個以上都在使用中。 

您還可以在相鄰字符串上使用 FOR /F 分析邏輯;方法是, 
用單引號將括號之間的 filenameset 括起來。這樣,該字符 
串會被當作一個文件中的一個單一輸入行。 

最後,您可以用 FOR /F 命令來分析命令的輸出。方法是,將 
括號之間的 filenameset 變成一個反括字符串。該字符串會 
被當作命令行,傳遞到一個子 CMD.EXE,其輸出會被抓進 
內存,並被當作文件分析。因此,以下例子: 

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i 

會枚舉當前環境中的環境變量名稱。 

另外,FOR 變量參照的替換已被增強。您現在可以使用下列 
選項語法: 

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

可以組合修飾符來得到多重結果: 

%~dpI - 僅將 %I 擴展到一個驅動器號和路徑 
%~nxI - 僅將 %I 擴展到一個文件名和擴展名 
%~fsI - 僅將 %I 擴展到一個帶有短名的完整路徑名 
%~dp$PATH:I - 搜索列在路徑環境變量的目錄,並將 %I 擴展 
到找到的第一個驅動器號和路徑。 
%~ftzaI - 將 %I 擴展到類似輸出線路的 DIR 

在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法 
用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名 
比較易讀,而且避免與不分大小寫的組合鍵混淆。 

dos中for的用法 

for /參數 %變量 in (集) do 命令 
FOR分四種參數 D L R F 

一、參數 /d 
for /d %%變量 in (集) do 命令 
/d 參數是指定僅對目錄而不是文件執行的for命令。 

二、參數 /R 
/R參數之後還可帶盤符及路徑 
for /r 此處可以帶有路徑 %變量 in (集) do 命令 
在/r 之後的那個路徑,指包含它之下的整個目錄樹(相當於DOS命令tree裏的範圍)中的所有目錄,如果僅爲一個英文句點 . ,是指當前路徑下的目錄樹,如果省略了路徑則特指當前目錄,而之後的in (集)則相當於與前面每個目錄相配的文件集 
這裏按in(集)中有無通配符分兩種情況 
1) in(集)中沒有通配符 
指定的是單個文件或列舉的具體文件(多個文件名之間用分隔符分隔,如空格、逗號等) 
例2 
@echo of 
for /r . %i in (abc.txt) do echo. > %i 
echo on 
注:這裏for /r 後的路徑僅有一個 . 而後面每個循環中echo. > %i相當於創建一個僅有一空行的文本文件,整體效果是在當前目錄下包括子錄,每個目錄中建一個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(集)中文件的項,而不去理會不含有相配文件的那些目錄 
例4: 
@echo off 
rem 刪除C盤中所有*.chk的文件 
for /r c:\ %%h in (*.chk) do del /q %%h 
pause 
注:del /q 表示用安靜模式刪除(不需確認) 
三、參數 /L 
for /L%%變量 in (起始值,每次增值,結束時的比較值) do 命令 
(上面L也可用小寫,主要爲了視覺上不與數字1混淆而沒用小寫) 
(起始值,每次增值,結束時的比較值)相當於一個等差數字序列,從“起始值”的數字開始,每次增加多少(也可設定爲負數)爲“每次增值”,並與“結束時的比較值”比較,超出則退出for循環(也不執行本輪後面的do 命令) 
例如 (1,1,3) 將產生序列 (1 2 3);(1,2,9)將產生序列(1 3 5 7 9);(5,-1,1) 將產生序列 (5 4 3 2 1);(1,3,18)將產生序列(1 7 10 13 16) 
例5 
@echooff 
::在D盤建立aa1~ aa5五個文件夾 
for /L%%i in (1,1,5) do md d:\aa %%i 
pause 

注:在行首,單個冒號:接一名稱,是標號行,對應於批處理中go後指向的位置,而雙冒號::一般是用來作註釋用,註釋在批處理中可以用rem加空格來表達,二者稍有不同,rem註釋在未關閉命令回顯時會在屏幕顯示出來,而::則什麼情況下都不會顯示。 

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

趙六 女 31 A-2 

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

解釋:這是for /r 在“%變量”前缺省參數選項時的情況,循環中每輪會默認以空格爲分隔,在打開的文件中逐行給字符串分段,又因爲沒給增添附加變量(即僅一個變量%c)則僅把第一段的字符賦給%c,再執行 do後的命令,然後進行循環的下一輪,並且默認忽略空行 
改一下: 
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 表示文本開始忽略的行數爲1 ——忽略幾行 
delims= 在一行中,用什麼單個符號(可以有多字符組合,之間也不能加空格,被理解爲多項單個字符,如要空格符須放最後)來分隔字符串作爲讀取賦值的單元(形成一段),本例中等號後是空的表示僅用空格來分隔。——用什麼刀來切分 
tokens=1,4 這個等號後的數字表示依次取第幾個被分隔的字符串段,來分別賦給%變量及順序附加的變量,本例取第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=後的數字號可以不按順序,但書寫的順序與分配給變量的順序是對應的,這是賦值,至於之後do命令中用不用是另一回事。換句話 ­­——最多隻需取哪幾段 
in (變量) 中的那個變量,代表起始的一個變量名,按tokens中定義的總個數來擴充附加變量名,如總個數爲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,執行@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內容如下: 

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 

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

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

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

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

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

可以組合修飾符來得到多重結果: 

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

簡記:凡是 %~ 打頭的操作符,都是文件名或環境變量的分離操作。而每項要想運用自如,則需要付出辛勤的練習。 

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

xx年xx月xx日 經查找在C盤、D盤的xx文件情況如下: 

時間 位置 

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

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

附:常見在批處理for命令中需要的一個的命令或者叫環境設置: 
for命令實際上是會作循環,如果在每輪的命令中改變某環境變量值,在默認狀態,一條for命令用%環境變量%只取一次值的,那麼下輪循環中再用時還是改變前的值(包括do後面帶有括號裏的多條命令的執行期間),就沒達到預期目的,爲此,引入下面命令: 
setlocal enabledelayedexpansion 
開始批處理文件中環境改動的本地化操作,並啓動延緩環境變量擴展。在執行SETLOCAL 達到批處理文件結尾時,對於該批處理文件的每個尚未執行的 setlocal 命令,都會有一個隱含的 endlocal 被執行。 
在取變量值時,用!變量名!可以動態取值,延遲環境變量擴充允許您使用一個不同的字符(驚歎號)在執行時間擴充環境變量。這個用法實際是屬於在批處理中所有複合型命令都需要注意的。如果批處理結束後不希望將改變的環境保留,建議總是加上setlocal 。 
要是結合一些其他複雜些的有關係統的、網絡的命令(如wmic、net)進來,那纔是方顯FOR英雄本色,比如遍歷本地磁盤可以用命令:wmic logicaldiskwhere "drivetype=3" get name 顯然要在所有磁盤裏查找某文件並作相應操作就很容易了,用好for命令也是需要其他命令和計算機基礎配合的。呵呵,本人水平有限,寫的只是低級層次的...但願能對有緣來這裏看的初學DOS的FOR命令者有所幫助。 

DOS for 實例 

格式:FOR [參數] %%變量名 IN (相關文件或命令) DO 執行的命令 
  作用:對一個或一組文件,字符串或命令結果中的每一個對象執行特定命令,達到我們想要的結果。 
  注意:在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable,而不要用 %variable。變量名稱是區分大小寫的,所以 %i 不同於 %I. 
  關於:for命令可以帶參數或不帶參數,帶參數時支持以下參數:/d /l /r /f 
  下面分別解釋一下 

  === 
  零:無參數時: 
  --- 
  FOR %variable IN (set) DO command [command-parameters] 
  %variable 指定一個單一字母可替換的參數。 
  (set) 指定一個或一組文件。可以使用通配符。 
  command 指定對每個文件執行的命令。 
  command-parameters 
  爲特定命令指定參數或命令行開關。 

  TTT示例: 
  for %%i in (t*.*) do echo %%i --顯示當前目錄下與t*.*相匹配的文件(只顯示文件名,不顯示路徑) 
  for %%i in (d:\mydocuments\*.doc) do @echo %%i --顯示d:\mydocuments\目錄下與*.doc相匹配的文件 

  === 
  一、參數 /d (參數只能顯示當前目錄下的目錄名字) 
  --- 
  格式:FOR /D %variable IN (set) DO command [command-parameters] 
  這個參數主要用於目錄搜索,不會搜索文件,/D 參數只能顯示當前目錄下的目錄名字。(TTT特別說明:只會搜索指定目錄下的目錄,不會搜索再下一級的目錄。) 

  TTT示例: 
  for /d %%i in (c:\*) do echo %%i --顯示c盤根目錄下的所有目錄 
  for /d %%i in (???) do echo %%i --顯示當前目錄下名字只有1-3個字母的目錄 

  === 
  二、參數 /R (搜索指定路徑及所有子目錄中與set相符合的所有文件) 
  --- 
  格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 
  此命令會搜索指定路徑及所有子目錄中與set相符合的所有文件,注意是指定路徑及所有子目錄。 

  1、set中的文件名如果含有通配符(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的所有文件,無相符文件的目錄則不列舉。 
  2、如果set中爲具體文件名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的所有子目錄)(並在後面加上具體的文件名),而不管set中的指定文件是否存在。 
  例:for /r c:\ %%i in (*.exe) do echo %%i --把C盤根目錄,和每個目錄的子目錄下面全部的EXE文件都列出來了!!!! 

  TTT示例: 
  for /r c:\ %%i in (boot.ini) do echo %%i --枚舉了c盤所有目錄 
  for /r d:\backup %%i in (1) do echo %%i --枚舉d\backup目錄 
  for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i --很好的搜索命令,列舉boot.ini存在的目錄 

  === 
  三、參數 /L (該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step) 
  --- 
  格式:FOR /L %variable IN (start,step,end) DO command [command-parameters] 
  該集表示以增量形式從開始到結束的一個數字序列。可以使用負的 Step 

  TTT示例: 
  for /l %%i in (1,1,5) do @echo %%i --輸出1 2 3 4 5 
  for /l %%i in (1,2,10) do @echo %%i --輸出1,3,5,7,9 
  for /l %%i in (100,-20,1) do @echo %%i --輸出100,80,60,40,20 
  for /l %%i in (1,1,5) do start cmd --打開5個CMD窗口 
  for /l %%i in (1,1,5) do md %%i --建立從1~5共5個文件夾 
  for /l %%i in (1,1,5) do rd /q %%i --刪除從1~5共5個文件夾
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章