在一組檔案內,針對每個檔案執行指定的命令。
Syntax
for {%% | %}<variable> in (<set>) do <command> [<commandlineoptions>]
Parameters
| Parameter | Description |
|---|---|
{%% \| %}<variable> |
Required. 表示可取代的參數。 使用單一百分號 (%) 在命令提示字元執行 for 命令。 使用雙百分號 (%%) 在批次檔中執行 for 指令。 變數區分大小寫,且必須以字母值表示,例如 %a、 %b或 %c。 |
(<set>) |
Required. 指定要執行命令的一或多個檔案、目錄或文字字串,或值範圍。 需要括弧。 |
<command> |
Required. 指定您要對每一個檔案、目錄或文字字串執行的指令,或對 set 中包含的值範圍執行。 |
<commandlineoptions> |
指定您想要搭配指定命令使用的任何命令列選項。 |
| /? | 在命令提示字元顯示說明。 |
Remarks
您可以在批次處理檔案內或直接從命令提示字元使用此命令。
下列屬性適用於 for 指令:
此命令會將
% variable或%% variable取代為指定集合中的每個文字字串,直到指定的命令處理所有檔案為止。變數名稱區分大小寫、全域,且一次不可超過52個。
若要避免與批次參數混淆,
%0請透過 ,您可以%9將 變數的任何字 元用於變數,但數字 0 到 9 除外。 對於簡單的批處理檔,單一字元,例如%%f將會運作。您可以對複雜批次檔中的 變數 使用多個值,以區分不同的可取代變數。
set 參數可以代表單一檔案群組或數組檔案。 您可以使用萬用字元 (* 和 ?) 來指定檔案集。 以下是有效的檔案集:
(*.doc) (*.doc *.txt *.me) (jan*.doc jan*.rpt feb*.doc feb*.rpt) (ar??1991.* ap??1991.*)當您使用此指令時, set 中的第一個值會取代
% variable或%% variable,然後指定的指令會處理此值。 這一直持續到處理對應於 設定 值的所有檔案 (或檔案群組) 為止。in 和 do 不是參數,但您必須將它們與此命令搭配使用。 如果您省略其中一個關鍵詞,就會顯示錯誤訊息。
如果已啟用命令延伸模組 (這是預設值) ,則支援下列其他形式的 for :
僅限目錄:如果 set 包含萬用字元 (* 或 ?) ,則會針對符合 set 的每一個目錄 (而不是指定目錄中的一組檔案) 執行指定的指令。 語法為:
for /d {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]遞歸: 遍歷根於 drive:path 的目錄樹狀結構,並在樹狀結構的每個目錄中執行 for 陳述式。 如果在 /r 之後未指定目錄,則會使用現行目錄作為根目錄。 如果 set 只是單一句點 (.),則只會列舉目錄樹狀結構。 語法為:
for /r [[<drive>:]<path>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]反覆運算一系列值: 使用反覆變數來設定起始值(start#),然後逐步執行一組值範圍,直到值超過設定結束值(end#)。 /l 透過比較 start# 和 end# 來執行迭代。 如果 start# 小於 end#,則會執行命令。 當迭代變數超過 end# 時,指令 shell 會結束迴圈。 您也可以使用負 階梯#來逐步執行遞減值的範圍。 例如,(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>]反覆運算和檔案剖析: 使用檔案剖析來處理命令輸出、字串和檔案內容。 使用疊代變數來定義您要檢查的內容或字串,並使用各種 parsingkeywords 選項來進一步修改剖析。 使用 parsingkeywords 權杖選項來指定哪些權杖應該作為疊代變數傳遞。 在沒有權杖選項的情況下使用時, /f 只會檢查第一個權杖。
檔案剖析包含讀取輸出、字串或檔案內容,然後將它分成個別的文字行,並將每一行剖析成零個或多個標記。 然後呼叫 for 迴圈,並將迭代變數值設定為權杖。 根據預設, /f 會從每個檔案的每一行傳遞第一個空白分隔權杖。 會略過空白行。
語法如下:
for /f [<parsingkeywords>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>] for /f [<parsingkeywords>] {%%|%}<variable> in (<literalstring>) do <command> [<commandlineoptions>] for /f [<parsingkeywords>] {%%|%}<variable> in ('<command>') do <command> [<commandlineoptions>]set 引數指定一或多個檔名。 每個檔案都會開啟、讀取和處理,然後再移至 集合中的下一個檔案。 若要置換預設剖析行為,請指定 parsingkeywords。 這是包含一或多個關鍵詞的引號字串,可指定不同的剖析選項。
如果您使用 usebackq 選項,請使用下列其中一種語法:
for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>] for /f [usebackq <parsingkeywords>] {%%|%}<variable> in ('<literalstring>') do <command> [<commandlineoptions>] for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (`<command>`) do <command> [<commandlineoptions>]下表列出可用於 parsingkeywords 的剖解析關鍵字。
Keyword Description eol= <c>指定行字元的結尾(只有一個字元)。 skip= <n>指定要在檔案開頭略過的行數。 delims= <xxx>指定分隔符集。 這會取代預設分隔符集的空間和索引標籤。 tokens= <x,y,m-n>指定要針對每個反覆專案傳遞至 for 迴圈的每行記號。 因此,會配置其他變數名稱。 m-n 指定範圍,從 第 m個到第 n個標記。 如果 tokens= 字串中的最後一個字元是星號 (*) ,則會配置一個額外的變數,並接收剖解析的最後一個記號之後的行上的剩餘文字。 usebackq 指定執行反引號字串做為命令、使用單引號字串做為常值字串,或針對包含空格的長檔名,允許中的 <set>檔名以雙引號括住。變數替換: 下表列出選用語法 (適用於任何變數 I):
具有修飾詞的變數 Description %~I%I展開 ,移除任何周圍引號。%~fI%I展開至完整路徑名稱。%~dI%I僅展開至驅動器號。%~pI%I僅展開至路徑。%~nI%I僅展開至檔名。%~xI%I僅擴充至擴展名。%~sI展開路徑,只包含簡短名稱。 %~aI%I展開至檔案的檔案屬性。%~tI%I展開至檔案的日期和時間。%~zI%I展開至檔案的大小。%~$PATH:I搜尋PATH環境變數中列出的目錄,並展開 %I至找到的第一個目錄的完整名稱。 如果未定義環境變數名稱,或搜尋找不到檔案,則此修飾詞會展開為空字串。下表列出可用來取得復合結果的修飾詞組合。
具有合併修飾詞的變數 Description %~dpI%I僅展開至驅動器號和路徑。%~nxI%I僅展開至檔名和擴展名。%~fsI%I展開為只有簡短名稱的完整路徑名稱。%~dp$PATH:I搜尋PATH環境變數 %I中所列的目錄,並展開至第一個找到的驅動器號和路徑。%~ftzaI展開 %I為類似 dir 的輸出行。在上述範例中,您可以使用其他有效值取代
%I和PATH。 變數名稱的有效值會%~結束語法。藉由使用大寫變數名稱,
%I您可以讓程式代碼更容易閱讀,並避免混淆修飾詞,這些修飾詞不會區分大小寫。
剖析字串:您可以
for /f用雙引號(<literalstring>usebackq)或單引號 (含 usebackq) 來包裝直接字串上的剖析邏輯 --例如,(MyString) 或 ('MyString')。<literalstring>會被視為檔案的單一輸入行。 在雙引號中剖析<literalstring>時,命令符號,例如 (\ & | > < ^) 會被視為一般字元。解析輸出: 您可以使用指令
for /f,在括弧之間放置反引號<command>來剖析指令的輸出。 它會被視為命令列,它會傳遞至子系 Cmd.exe。 輸出會擷取到記憶體中,並剖析為檔案。
Examples
若要在批次檔中使用 for ,請使用下列語法:
for {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
若要使用可取代變數 %f來顯示目前目錄中副檔名為 .doc 或 .txt 的所有檔案內容,請鍵入:
for %f in (*.doc *.txt) do type %f
在上述範例中,目前目錄中具有 .doc 或 .txt 副檔名的每個檔案都會取代 %f 變數,直到顯示每個檔案的內容為止。 若要在批次檔中使用此指令,請將每次出現的 %f 都取代為 %%f。 否則會忽略變數,並顯示錯誤訊息。
若要剖析檔案,請忽略批注行,請輸入:
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 的變數。
若要將 set 放在括弧之間來剖析命令的輸出,請鍵入:
for /f "usebackq delims==" %i in (`set`) do @echo %i
若要執行目錄中所有檔案的遞歸迴圈,包括子目錄,並在上次修改時回應其完整路徑,以及其檔案大小,請輸入:
for /r "C:\My Dir\" %A in (*.*) do echo %~ftzA