對象
針對一組檔案內的每個檔案執行指定的命令。
語法
for {%% | %}<variable> in (<set>) do <command> [<commandlineoptions>]
參數
參數 | 描述 |
---|---|
{%% \| %}<variable> |
必要。 表示可取代的參數。 使用單一百分比符號 (% ) 在命令提示字元執行 for 命令。 使用雙百分比符號 (%% ) 在批次檔中執行 for 命令。 變數會區分大小寫,而且必須以字母順序值來表示,例如 %a、 %b或 %c。 |
(<set> ) |
必要。 指定要在其中執行命令的一或多個檔案、目錄或文字字串,或值範圍。 它必須用括號括住。 |
<command> |
必要。 指定您想要在每個檔案、目錄或文字字串上執行的命令,或在 集合中包含的值範圍上執行。 |
<commandlineoptions> |
指定您想要搭配指定命令使用的任何命令列選項。 |
/? | 在命令提示字元顯示說明。 |
備註
您可以在批次檔內或直接從命令提示字元使用此命令。
下列屬性適用于 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
,然後指定的命令會處理此值。 這會繼續執行,直到處理對應至 設定 值的所有檔案 (或檔案群組) 為止。在 和 中 不是參數,但您必須搭配此命令使用這些參數。 如果您省略其中一個關鍵字,則會出現錯誤訊息。
如果啟用命令延伸模組 (為預設) ,則支援下列額外形式的:
僅限目錄: 如果 set 包含萬用字元 (* 或 ?) ,則指定的 命令 會針對每個目錄執行 (,而不是指定目錄中符合 集合的一組檔案) 。 語法是:
for /d {%%|%}<Variable> in (<Set>) do <Command> [<CommandLineOptions>]
遞迴的: 逐步執行以 drive:path 為根目錄的目錄樹狀結構,並在樹狀結構的每個目錄中執行 for 語句。 如果未在 /r之後指定任何目錄,則會使用目前的目錄作為根目錄。 如果 set 只是單一句點 (.) ,它只會列舉目錄樹狀結構。 語法是:
for /r [[<drive>:]<path>] {%%|%}<variable> in (<set>) do <command> [<commandlinepptions>]
反覆運算值範圍: 使用反復變數來設定 starting value (start#) ,然後逐步執行一組值範圍,直到值超過 set end# (end#) 。 /l 會藉由比較 start# 與 end# 來執行反復執行。 如果 start# 小於 end#,命令將會執行。 當反復變數超過 end#時,命令殼層會結束迴圈。 您也可以使用負 步驟# 來逐步執行遞減值的範圍。 例如, (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> [<commandlinepptions>]
反覆運算和檔案剖析: 使用檔案剖析來處理命令輸出、字串和檔案內容。 使用反復變數來定義您想要檢查的內容或字串,並使用各種 parsingkeywords 選項進一步修改剖析。 使用 parsingkeywords Token 選項來指定應傳遞哪些權杖做為反復變數。 不使用 Token 選項時, /f 只會檢查第一個權杖。
檔案剖析包含讀取輸出、字串或檔案內容,然後將它分成個別的文字行,並將每一行剖析成零個或多個標記。 接著會呼叫 for 迴圈,並將反復變數值設定為權杖。 根據預設, /f 會從每個檔案的每一行傳遞第一個空白分隔標記。 會略過空白行。
語法如下:
for /f [<parsingkeywords>] {%%|%}<variable> in (<set>) do <command> [<commandlinepptions>] for /f [<parsingkeywords>] {%%|%}<variable> in (<literalstring>) do <command> [<commandlinepptions>] for /f [<parsingkeywords>] {%%|%}<variable> in ('<command>') do <command> [<commandlinepptions>]
set引數會指定一或多個檔案名。 每個檔案都會開啟、讀取和處理,然後再移至 集合中的下一個檔案。 若要覆寫預設剖析行為,請指定 parsingkeywords。 這是包含一或多個關鍵字的引號字串,可指定不同的剖析選項。
如果您使用 usebackq 選項,請使用下列其中一個語法:
for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (<Set>) do <command> [<commandlinepptions>] for /f [usebackq <parsingkeywords>] {%%|%}<variable> in ('<LiteralString>') do <command> [<commandlinepptions>] for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (`<command>`) do <command> [<commandlinepptions>]
下表列出可用於 剖析keyword 的剖析關鍵字。
關鍵字 描述 eol= <c>
指定行字元結尾 (只有一個字元) 。 skip= <n>
指定要在檔案開頭略過的行數。 delims= <xxx>
指定分隔符號集。 這會取代空格和索引標籤的預設分隔符號集。 token= <x,y,m–n>
指定要針對每個反復專案傳遞至 for 迴圈的每一行標記。 因此,會配置其他變數名稱。 m-n 指定從 m到 n個標記的範圍。 如果 tokens= string 中的最後一個字元是星號 (*) ,則會配置額外的變數,並在剖析的最後一個標記之後接收行上的其餘文字。 usebackq 指定以命令執行後引號字串、使用單引號字串做為常值字串,或針對包含空格的長檔名,允許 中的 <set>
檔案名以雙引號括住。變數替代: 下表列出任何變數 I) 的選擇性語法 (:
具有修飾詞的變數 描述 %~I
%I
展開可移除任何周圍引號的 。%~fI
%I
展開至完整路徑名稱。%~dI
%I
僅展開為磁碟機號。%~pI
%I
僅展開至路徑。%~nI
%I
僅展開至檔案名。%~xI
%I
僅展開為副檔名。%~sI
展開路徑,只包含簡短名稱。 %~aI
%I
展開至檔案的檔案屬性。%~tI
%I
展開至檔案的日期和時間。%~zI
%I
展開至檔案的大小。%~$PATH:I
搜尋 PATH 環境變數中列出的目錄,並展開 %I
至找到的第一個目錄的完整名稱。 如果未定義環境變數名稱,或搜尋找不到檔案,這個修飾詞會展開為空字串。下表列出可用來取得複合結果的修飾片語合。
具有合併修飾詞的變數 描述 %~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。 輸出會擷取到記憶體中,並剖析為檔案。
範例
若要在批次檔中 使用 ,請使用下列語法:
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語句的主體會參考%i以取得第二個權杖、%j以取得第三個權杖,以及%k以取得其餘所有權杖。 如果您提供的檔案名包含空格,請在文字周圍使用引號 (,例如檔案名) 。 若要使用引號,您必須使用 usebackq。 否則,引號會解譯為定義要剖析的常值字串。
%i 在 for 語句中明確宣告。 %j 和 %k 是使用 token=隱含宣告。 您可以使用 token= 來指定最多 26 個權杖,前提是它不會嘗試宣告高於字母 z 或 Z 的變數。
若要藉由在括弧之間放置 set 來剖析命令的輸出,請輸入:
for /f "usebackq delims==" %i in (`set`) do @echo %i