共用方式為


為了

在一組檔案內,針對每個檔案執行指定的命令。

語法

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

參數

參數 說明
{%% \| %}<variable> 必須的。 表示可取代的參數。 使用單一百分比符號 (%) 在命令提示字元中執行 for 命令。 使用雙百分比符號 (%%) 在批處理檔中執行 for 命令。 變數區分大小寫,且必須以字母值表示,例如 %a%b%c
<set> 必須的。 指定要執行命令的一或多個檔案、目錄或文字字串,或值範圍。 需要括弧。
<command> 必須的。 指定您想要在每個檔案、目錄或文字字串上執行的命令,或 指定集合中包含的值範圍。
<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 包含通配符 (*),則指定的 命令 會針對每個目錄執行,而不是符合 集合的一組檔案。 語法為:

      for /d {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
      
    • 遞歸的: 逐步執行以 drivepath 為根目錄的目錄樹狀結構,並在樹狀結構的每個目錄中執行 for 語句。 如果在 /r 之後未指定任何目錄,則目前的目錄會當做根目錄使用。 如果 set 只是單一句號 (.),它只會列舉目錄樹狀結構。 語法為:

      for /r [[<drive>:]<path>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
      
    • 反覆運算一系列值: 使用反覆變數來設定起始值(start#),然後逐步執行一組值範圍,直到值超過設定結束值(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> [<commandlineoptions>]
      
    • 反覆運算和檔案剖析: 使用檔案剖析來處理命令輸出、字串和檔案內容。 使用反覆變數來定義您想要檢查的內容或字串,並使用各種 剖析機碼字 選項進一步修改剖析。 使用 parsingkeywords Token 選項來指定應傳遞哪些令牌做為反覆變數。 不使用令牌選項時, /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>]
      

      下表列出可用於 剖析keyword 的剖析關鍵詞。

      關鍵詞 說明
      EOL=<c> 指定行字元的結尾(只有一個字元)。
      跳過=<n> 指定要在檔案開頭略過的行數。
      德利姆斯=<xxx> 指定分隔符集。 這會取代預設分隔符集的空間和索引標籤。
      token=<x,y,m–n> 指定要針對每個反覆項目傳遞至 for 迴圈的每一行令牌。 因此,會配置其他變數名稱。 m-n 指定範圍,從 mn個標記。 如果 token= 字串中的最後一個字元是星號 (*),則會配置額外的變數,並在剖析的最後一個標記之後,接收行上的其餘文字。
      使用返回 指定執行反引號字串做為命令、使用單引號字串做為常值字串,或針對包含空格的長檔名,允許中的 <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。 否則,引號會解譯為定義要剖析的常值字串。

%ifor 語句中明確宣告。 %j%k 會使用 tokens=隱含宣告。 您可以使用 token= 來指定最多 26 個令牌,如果它不會嘗試宣告高於字母 z 或 Z 的變數。

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

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

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

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