對(duì)一組文件中的每個(gè)文件運(yùn)行指定的命令。
可以在批處理文件中或直接從命令提示符使用 for 命令。
下列屬性適用于 for 命令:
Set 參數(shù)可以代表單個(gè)或多個(gè)文件組??梢允褂猛ㄅ浞?* 和 ?)指定文件組。以下為有效文件組:
(*.doc)
(*.doc *.txt *.me)
(jan*.doc jan*.rpt feb*.doc feb*.rpt)
(ar??1991.* ap??1991.*)
在使用 for 命令時(shí),Set 中的第一個(gè)值代替 %Variable 或 %%Variable,然后由指定的命令處理該值。這會(huì)持續(xù)到處理完與 Set 值相對(duì)應(yīng)的所有文件(或文件組)為止。
In 和 do 不是參數(shù),但必須將它們與 for 一起使用。如果省略其中任何一個(gè)關(guān)鍵字,就會(huì)出現(xiàn)錯(cuò)誤消息。
如果啟用命令擴(kuò)展(這是默認(rèn)設(shè)置),則支持 for 的下列其他格式:
如果 Set 包含通配符(* 和 ?),將對(duì)與 Set 相匹配的每個(gè)目錄(而不是指定目錄中的文件組)執(zhí)行指定的 Command。語法是:
for /D {%% | %} Variable in (Set) do Command [CommandLineOptions]
進(jìn)入根目錄樹 [Drive:]Path,在樹的每個(gè)目錄中執(zhí)行 for 語句。如果在 /R 后沒有指定目錄,則認(rèn)為是當(dāng)前目錄。如果 Set 只是一個(gè)句點(diǎn) (.),則只枚舉目錄樹。語法是:
for /R [[Drive :]Path] {%% | %} Variable in (Set) do Command [CommandLineOptions]
使用迭代變量設(shè)置起始值 (Start#),然后逐步執(zhí)行一組范圍的值,直到該值超過所設(shè)置的終止值 (End#)。/L 將通過對(duì) Start# 與 End# 進(jìn)行比較來執(zhí)行迭代變量。如果 Start# 小于 End#,就會(huì)執(zhí)行該命令。如果迭代變量超過 End#,則命令解釋程序退出此循環(huán)。還可以使用負(fù)的 Step# 以遞減數(shù)值的方式逐步執(zhí)行此范圍內(nèi)的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。語法是:
for /L {%% | %}Variable in (Start#,Step#,End#) do Command [CommandLineOptions]
使用文件解析來處理命令輸出、字符串及文件內(nèi)容。使用迭代變量定義要檢查的內(nèi)容或字符串,并使用各種 ParsingKeywords 選項(xiàng)進(jìn)一步修改解析方式。使用 ParsingKeywords href="HELP=glossary.hlp TOPIC=token">令牌選項(xiàng)指定哪些令牌應(yīng)該作為迭代變量傳遞。請(qǐng)注意:在沒有使用令牌選項(xiàng)時(shí),/F 將只檢查第一個(gè)令牌。
文件解析過程包括讀取輸出、字符串或文件內(nèi)容,將其分成獨(dú)立的文本行以及再將每行解析成零個(gè)或更多個(gè)令牌。然后通過設(shè)置為令牌的迭代變量值,調(diào)用 for 循環(huán)。默認(rèn)情況下,/F 傳遞每個(gè)文件每一行的第一個(gè)空白分隔符號(hào)。跳過空行。語法的不同點(diǎn)為:
for /F ["ParsingKeywords"] {%% | %}Variable in (FileNameSet) do Command [CommandLineOptions]
for /F ["ParsingKeywords"] {%% | %}Variable in ("LiteralString") do Command [CommandLineOptions]
for /F ["ParsingKeywords"] {%% | %}Variable in ('Command') do Command [CommandLineOptions]
FileNameSet 參數(shù)指定一個(gè)或多個(gè)文件名稱。每個(gè)文件都將被打開、讀取和處理,然后再繼續(xù)執(zhí)行 FileNameSet 中的下一個(gè)文件。要覆蓋默認(rèn)解析行為,請(qǐng)指定 "ParsingKeywords"。這是一個(gè)引號(hào)括起來的字符串,它包含一個(gè)或多個(gè)關(guān)鍵字以指定不同的解析選項(xiàng)。
如果使用 usebackq 選項(xiàng),請(qǐng)使用如下語法之一:
for /F ["usebackqParsingKeywords"] {%% | %}Variable in ("FileNameSet") do Command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}Variable in ('LiteralString') do Command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}Variable in ('Command') do Command [CommandLineOptions]
下表列出可以用于 ParsingKeywords 的解析關(guān)鍵字。
| 關(guān)鍵字 | 描述 |
|---|---|
| eol=c | 指定行尾字符(僅一個(gè)字符)。 |
| skip=N | 指定在文件的開頭跳過的行數(shù)。 |
| delims=xxx | 指定分隔符集合。這將替換空格和制表符這一默認(rèn)分隔符集。 |
| 指定將哪些令牌從每行傳遞到每個(gè)迭代的 for 正文。這樣就分配了附加變量名稱。M-N 格式是一個(gè)范圍,指定從第 M 個(gè)到第 N 個(gè)令牌。如果 tokens= 字符串中最后一個(gè)字符是星號(hào) (*),那么將分配另外的變量,并接收解析的最后一個(gè)令牌之后該行剩余的文本。 | |
| usebackq | 指定可以使用引號(hào)引用 FileNameSet 中的文件名,將后面帶有引號(hào)的字符串作為一個(gè)命令執(zhí)行,而帶有單引號(hào)的字符串是文字字符串命令。 |
已經(jīng)增強(qiáng)了 for 變量引用的替換修飾符。下表列出可選語法(對(duì)于任意變量 I)。
| 描述 | |
|---|---|
| %~I | 展開 %I,刪除任何前后引號(hào) ("")。 |
| %~fI | 將 %I 展開為完全限定的路徑名。 |
| %~dI | 只將 %I 展開到驅(qū)動(dòng)器號(hào)。 |
| %~pI | 只將 %I 展開到路徑。 |
| %~nI | 只將 %I 展開到文件名。 |
| %~xI | 只將 %I 展開到文件擴(kuò)展名。 |
| %~sI | 展開路徑只包含短名稱。 |
| %~aI | 將 %I 展開到文件的文件屬性。 |
| %~tI | 將 %I 展開到文件的日期和時(shí)間。 |
| %~zI | 將 %I 展開到文件的大小。 |
| %~$PATH:I | 搜索 PATH 環(huán)境變量所列出的目錄,并將 %I 展開到第一個(gè)找到的完全限定的名稱。如果沒有定義環(huán)境變量名稱,或通過搜索沒有找到文件,則此修飾符將擴(kuò)展成空字符串。 |
下表列出了可用來獲得復(fù)合結(jié)果的修飾符組合。
| 描述 | |
|---|---|
| %~dpI | 只將 %I 展開到驅(qū)動(dòng)器號(hào)和路徑。 |
| %~nxI | 只將 %I 展開到文件名和擴(kuò)展名。 |
| %~fsI | 將 %I 展開到只包含短名稱的完整路徑名。 |
| %~dp$PATH:I | 在 PATH 環(huán)境變量中所列出的目錄中搜索 %I,并將其展開到第一個(gè)找到的驅(qū)動(dòng)器號(hào)和路徑。 |
| %~ftzaI | 將 %I 展開到輸出行(如 dir 一樣)。 |
在上述示例中,可以用其他有效值替換 %I 和 PATH。有效的 for 變量名終止
使用大寫變量名(例如 %I),可以使代碼更具可讀性,并且避免與不區(qū)分大小寫的修飾符混淆。
通過將 FileNameSet 用單引號(hào)括起來,(即 'FileNameSet'),可以使用 for /F 對(duì)直接字符串進(jìn)行邏輯解析。系統(tǒng)將 FileNameSet 視為從某個(gè)文件輸入的單行,然后對(duì)其進(jìn)行解析。
通過將圓括號(hào)內(nèi)的 FileNameSet 變?yōu)楹竺鎺в幸?hào)的字符串,可以利用 for /F 命令解析命令輸出。此命令被視為命令行傳遞給子命令 Cmd.exe,并將輸出捕獲到內(nèi)存并進(jìn)行解析,就象它是一個(gè)文件一樣。
要在批處理文件中使用 for,請(qǐng)使用以下語法:
for %%Variable in (Set) do Command [CommandLineOptions]
要通過使用可替換變量 %f 顯示當(dāng)前目錄中擴(kuò)展名為 .doc 或 .txt 的所有文件的內(nèi)容,請(qǐng)鍵入:
for %f in (*.doc *.txt) do type %f
在前述示例中,當(dāng)前目錄中擴(kuò)展名為 .doc 或 .txt 的每個(gè)文件都被替代為變量 %f,直到每個(gè)文件的內(nèi)容都被顯示出來為止。要在批處理文件中使用此命令,請(qǐng)使用 %%f 替換所有的 %f。否則,系統(tǒng)將忽略該變量并顯示一條錯(cuò)誤消息。
要解析文件,同時(shí)忽略注釋行,請(qǐng)鍵入:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
此命令將解析 myfile.txt 文件的每一行,忽略以分號(hào)開頭的行,將第二和第三個(gè)令牌從各行傳遞到 FOR 正文中(令牌通過逗號(hào)或空格分隔)。FOR 語句的正文引用 %i 獲得第二個(gè)令牌,引用 %j 獲得第三個(gè)令牌,引用 %k 獲得其余全部令牌。如果您提供的文件名包含空格,請(qǐng)使用引號(hào)將文本引起來(例如 "File Name")。要使用引號(hào),則必須使用 usebackq。否則,引號(hào)將被解釋為定義要解析的文字字符串。
在 FOR 語句中顯式聲明 %i。使用 tokens= 隱式聲明 %j 和 %k。只要不會(huì)引起試圖聲明高于字母“z”或“Z”的某個(gè)變量,則使用 tokens= 可以指定最多 26 個(gè)令牌。
要通過將 FileNameSet 放在括號(hào)中間來解析命令輸出,請(qǐng)鍵入:
這個(gè)示例枚舉了當(dāng)前環(huán)境中的環(huán)境變量名。
| 格式 | 含義 |
|---|---|
| 斜體 | 用戶必須提供的信息 |
| 粗體 | 用戶必須準(zhǔn)確鍵入的要顯示的元素 |
| 省略號(hào) (...) | 在命令行中可多次重復(fù)的參數(shù) |
| 中括號(hào) ([]) | 可選項(xiàng) |
| 大括號(hào) ({});選項(xiàng)用豎線 (|) 分隔。例如:{even|odd} | 用戶必須從選項(xiàng)集合中選擇一個(gè) |
Courier 字體 | 代碼或程序輸出 |