為一組檔案中的每個檔案執行指定的命令。

語法

for {%% | %}<variable> in (<set>) do <command> [<commandlineoptions>]

參數

參數 描述
{%% \| %}<variable> 必要。 表示可替換的參數。 使用單一百分比符號 (%) 在命令提示字元執行 for 命令。 使用雙百分比符號 (%%) 在批次檔中執行 for 命令。 變數區分大小寫,而且必須以字母順序值來表示變數,例如:%a%b%c
(<set>) 必要。 指定要執行命令的一或多個檔案、目錄或文字字串,或值範圍。 它必須用括號括住。
<command> 必要。 指定要在每個檔案、目錄或文字字串,或 set 中包含的值範圍中執行的命令。
<commandlineoptions> 指定要搭配指定命令使用的任何命令列選項。
/? 在命令提示字元顯示說明。

備註

  • 您可以在批次檔中或直接從命令提示字元使用此命令。

  • 下列屬性適用於 for 命令:

    • 此命令會將 % variable%% variable 替換為指定集合中的每個文字字串,直到指定的命令處理玩所有檔案為止。

    • 變數名稱全域區分大小寫,且一次不可超過 52 個。

    • 若要避免與批次參數 %0%9 混淆,您可以使用數字 09 之外的任何字元做為變數。 對於簡單的批次檔,單一字元 (例如 %%f) 將會運作。

    • 您可以在複雜的批次檔中使用變數的多個值來區分不同的可替換變數。

  • set 參數可以代表單一檔案群組或多組檔案群組。 您可以使用萬用字元 (*?) 來指定檔案組。 以下是有效的檔案組:

    (*.doc)
    (*.doc *.txt *.me)
    (jan*.doc jan*.rpt feb*.doc feb*.rpt)
    (ar??1991.* ap??1991.*)
    
  • 當您使用此命令時,set 中的第一個值會取代 % variable%% variable,然後指定的命令會處理此值。 這會繼續執行,直到處理完與 set 值相對應的所有檔案 (或檔案群組)。

  • Indo 不是參數,但必須搭配此命令使用。 如果省略其中一個關鍵字,就會顯示錯誤訊息。

  • 如果已啟用命令延伸模組 (也就是預設值),則支援以下附加格式的 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> [<commandlinepptions>]
      
    • 逐一查看值範圍:使用反覆變數來設定起始值 (start#),然後逐步執行設定的值範圍,直到該值超過設定結束值 (end#)。 /l 會藉由比較 start# 與 end# 來執行迭代。 如果 start# 小於 end#,則指令執行。 當反覆變數超過 end # 時,命令 shell 結束迴圈。 您也可以使用負的 step# 以遞減的值逐步執行某個範圍。 例如:(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 權杖選項來指定應傳遞哪些權杖做為反覆變數。 不使用權杖選項時,/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 引數會指定一或多個檔案名稱。 在每個檔案移動到 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>]
      

      下表列出可用於 parsingkeywords 的剖析關鍵字。

      關鍵字 描述
      eol=<c> 指定行結束字元 (只有一個字元)。
      skip=<n> 指定要在檔案開頭跳過的行數。
      delims=<xxx> 指定分隔符號集。 這會替換預設分隔符號集的空格和定位字元。
      tokens=<x,y,m–n> 指定每行中的哪些權杖要傳遞到每次迭代的 for 迴圈。 因此,會分配附加的變數名稱。 m-n 指定從第 m 個權杖到第 n 個權杖的範圍。 如果 tokens= 字串中的最後一個字元是星號 (*),則會指派一個附加變數,並在剖析的最後一個權杖之後,接收行上的其餘文字。
      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 替換為其他有效值。 有效的 for 變數名會結束 %~ 語法。

      藉由使用大寫變數名稱 (例如 %I),可以使程式碼更容易閱讀,並避免與不區分大小寫的修飾詞混淆。

  • 剖析字串:透過使用雙引號 (不含 usebackq) 或單引號 ( usebackq) 括住 <literalstring>,您可以在即時字串上使用 for /f 剖析邏輯,例如:(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 主體 (標記由逗號或空格分隔)。 for 語句的主體會引用 %i 以取得第二個權杖、引用 %j 來取得第三個權杖,而 %k 則用來取得其餘所有權杖。 如果您提供的檔案名稱包含空格,請使用引號括住文字 (例如 File Name)。 若要使用引號,您必須使用 usebackq。 否則,引號會解譯為定義要剖析的常值字串。

%ifor 語句中明確宣告。 %j%k 是使用 token= 隱含地宣告。 如果不會導致嘗試宣告高於字母 z 或 Z 的變數,則可以使用 tokens= 指定最多 26 個權杖。

若要藉由在括號之間放置 set 來剖析命令的輸出,請輸入:

for /f "usebackq delims==" %i in (`set`) do @echo %i

若要執行目錄 (包括子目錄) 中所有檔案的遞迴迴圈,並回應其完整路徑、上次修改時間及其檔案大小,請輸入:

for /r "C:\My Dir\" %A in (*.*) do echo %~ftzA