概要

このページは、Windowsのバッチファイルのfor文の/Fについて記述します。
for /F オプション %%変数名 in (ファイル名) do コマンド名
/Fはファイルまたはコマンドの実行結果を行単位で変数に読み込み繰り返し処理を行えます。
変数名は英字で1文字でなければなりません。
オプションには以下の指定ができます。
オプション 説明 記述例
動作
eol=c c 行頭コメント開始文字をcにする。この文字以降は注釈として無視される eol='
'が行頭にあるとその行は無視される
skip=n ファイルの先頭からn行を無視する skip=2
先頭から2行を無視する
delims=xxx xxx デリミタをxxxとする。複数文字の指定が可能。デフォルトはタブとスペース "delims="
デリミタを無効にする
tokens=x,y
tokens=x-y
x,y どのパートを変数に代入してコマンド側に渡すかを指定する。 tokens=1-6
1列目から6列目までを変数に代入する
tokens=1,2
1列目と2列目を変数に代入する
usebackq=`コマンド` `(バッククォート)で囲まれた文字列をコマンドとして実行する `dir`
dirコマンドの実行結果を代入
バッククォートは日本語109キーボードでは以下の様にすると入力できます。
Shift + ` @ " SVGの代替画像

動作環境

以下の環境で動作を確認しました。
Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows XP Professional Service Pack 3 32bit
Windows 2000 Professional Service Pack 4

ファイルを行単位で読込みtableタグを付加して出力する(tokens,eol)

入力ファイルを読み取り空白またはタブを列の区切りと解釈して読み取りhtmlのtableタグを付加します。
出力をリダイレクトしてhtmlファイルとして保存すれば表として閲覧できます。
本バッチファイルでは6列と見なして読み取っています。
for文で指定している変数Aは1列目の文字列が格納されます。2列目以降はB~Fの様にfor文で指定した変数に対してアルファベット順の変数名に格納されます。
変数へ代入する対象となる列はtokensオプションで指定しています。
for /fの注釈文字はディフォルトで;(セミコロン)が指定されているので;で始まる行は無視されます。
eolで新たな注釈文字を設定することでディフォルトの;を打ち消します。
各列の値はA~F変数に代入されているのでechoで標準出力に出力します。htmlのタグは文字< >で囲まれており、バッチファイルではこれらの文字はリダイレクトを指定することになるので、^(キャレットまたはカレット 文字コード0x5e)を前置して文字として認識させます。行末の^はコマンドが次の行へ続くことを示しています。

入力ファイル d:¥bat¥for_f¥table.txt

;1 2 3 4 5 6
"1 4 9 16 25 36
 1 8 27 64 125 216

バッチファイル d:¥bat¥for_f¥1.bat

@echo off
rem 空白またはタブで区切られた6列のテキストをhtmlのtableタグ形式に変換する

echo ^<table border=1^>

for /f "tokens=1-6 eol=^ "  %%A in (d:¥bat¥for_f¥table.txt) do (

 echo ^<tr^>^
  ^<td^>%%A^</td^>^
  ^<td^>%%B^</td^>^
  ^<td^>%%C^</td^>^
  ^<td^>%%D^</td^>^
  ^<td^>%%E^</td^>^
  ^<td^>%%F^</td^>^
  ^</tr^>
)
echo ^</table^>

実行結果

<table border=1>
<tr>  <td>;1</td>  <td>2</td>  <td>3</td>  <td>4</td>  <td>5</td>  <td>6</td>  </tr>
<tr>  <td>"1</td>  <td>4</td>  <td>9</td>  <td>16</td>  <td>25</td>  <td>36</td>  </tr>
<tr>  <td>1</td>  <td>8</td>  <td>27</td>  <td>64</td>  <td>125</td>  <td>216</td>  </tr>
</table>

htmlファイルに保存して表示した例

ファイルを行単位で読込み文字列を表示(delims,eol)

ファイルを行単位で読み込み無加工で表示します。
ただし空行は無視されます。
ディフォルトではタブとスペースで列が区切られるので、delimsオプションで区切り文字を無効にします。
文字列の置き換えが各行ごとに正常に行えるように遅延展開を使用するためにsetlocal ENABLEDELAYEDEXPANSION を指定しています。
for /fの注釈文字はディフォルトで;(セミコロン)が指定されているので;で始まる行は無視されます。
eolで新たな注釈文字を設定することでディフォルトの;を打ち消します。
for文で読み込んだ行を環境変数srcに代入し1をAに置き換えた後、echoで標準出力に出力しています。

入力ファイル d:¥bat¥for_f¥src1.txt

// 0~9 までを ; 標準出力に出力
for(n=0;n<10;n++){
        printf("%d¥n",n);
}

;test
 test

バッチファイル d:¥bat¥for_f¥2.bat

@echo off
rem ファイルを行単位で読み込み表示

for /f  delims^=^ eol^=  %%A in (d:¥bat¥for_f¥src1.txt) do (
        set src=%%A
        echo %%A
)

出力結果

// 0~9 までを ; 標準出力に出力
for(n=0;n<10;n++){
        printf("%d¥n",n);
}
;test
 test

ファイルを行単位で読み込み文字列を置換えて表示する(delims)

ファイルを行単位で読み込み文字列printfを_tprintfに置き換えます。
さらに文字列"%d\n"を_TEXT("%d\n")に置き換え出力します。
ただし空行は無視されます。
ディフォルトではタブとスペースで列が区切られるので、delimsオプションで区切り文字を無効にします。
for /fの注釈文字はディフォルトで;(セミコロン)が指定されているので;で始まる行は無視されます。
eolで新たな注釈文字を設定することでディフォルトの;を打ち消します。
文字列の置き換えが各行ごとに正常に行えるように遅延展開を使用するためにsetlocal ENABLEDELAYEDEXPANSION を指定しています。
for文で読み込んだ行を環境変数src1に代入しprintfを_tprintfに置き換えた後、src2に代入します。
src2の("を(_TEXT("に置き換えた後、src3に代入します。
src3の",を"),に置き換えた後、src4に代入します。
echoで標準出力にsrc4を出力しています。

入力ファイル d:¥bat¥for_f¥src1.txt

// 0~9 までを ; 標準出力に出力
for(n=0;n<10;n++){
        printf("%d¥n",n);
}

;test
 test

バッチファイル d:¥bat¥for_f¥3.bat

@echo off

setlocal ENABLEDELAYEDEXPANSION

for /f  delims^=^ eol^=  %%A in (d:¥bat¥for_f¥src1.txt) do (
        set src1=%%A
        set src2=!src1:printf=_tprintf!
        set src3=!src2:("=(_TEXT("!
        set src4=!src3:",="^),!
        echo !src4!
)

endlocal

出力結果

// 0~9 までを ; 標準出力に出力
for(n=0;n<10;n++){
        _tprintf(_TEXT("%d¥n"),n);
}
;test
 test

ファイルを行単位で読み込み注釈を無視して文字列を表示する(delims,eol)

ファイルを行単位で読み込み変数に代入します。ただし注釈文字列'で始まる行は無視します。
空行も無視されます。
ディフォルトではタブとスペースで列が区切られるので、delimsオプションで区切り文字を無効にします。
for /fの注釈文字はディフォルトで;(セミコロン)が指定されているので;で始まる行は無視されます。
eolで'(バッククォート)を指定し新たな注釈文字とします。
echoで標準出力に変数を出力しています。

入力ファイル d:¥bat¥for_f¥src2.txt

' 1~10を表示

FOR N=1 TO 10
   PRINTF N
NEXT N

END

バッチファイル d:¥bat¥for_f¥4.bat

@echo off

for /f "eol=' delims=" %%A in (d:¥bat¥for_f¥src2.txt) do (
        echo %%A
)

出力結果

FOR N=1 TO 10
   PRINTF N
NEXT N
END

コマンドの実行結果を行単位で読み込み表示する(usebackq,tokens)

dirコマンドの実行結果をfor文で1行ずつ取り込み表示します。
delimsオプションおよびeolオプションは指定指定なので、空白またはタブで列が区切られます。
各列は変数A~Dに代入されるので、echoで出力します。

dir コマンドの実行結果

 ドライブ D のボリューム ラベルは 12345 です
 ボリューム シリアル番号は 1234-5678 です

 D:¥bat¥for_f のディレクトリ

2016/01/11  11:55    <DIR>          .
2016/01/11  11:55    <DIR>          ..
2016/01/10  22:31               356 1.bat
2016/01/10  22:43               141 2.bat
2016/01/11  07:56               244 3.bat
2016/01/10  22:11                87 4.bat
2016/01/11  11:40                93 5.bat
2016/01/10  22:44                95 src1.txt
2016/01/10  22:11                60 src2.txt
2016/01/10  22:29                51 table.txt
               8 個のファイル               1,127 バイト
               2 個のディレクトリ  23,891,248,128 バイトの空き領域

バッチファイル d:¥bat¥for_f¥5.bat

@echo off

for /f "usebackq tokens=1,2,3,4" %%A in (`dir`) do (
        echo %%A %%B %%C %%D
)

出力結果

ドライブ D のボリューム ラベルは
ボリューム シリアル番号は 1234-5678 です
D:¥bat¥for_f のディレクトリ  
2016/01/11 11:55 <DIR> .
2016/01/11 11:55 <DIR> ..
2016/01/10 22:31 356 1.bat
2016/01/10 22:43 141 2.bat
2016/01/11 07:56 244 3.bat
2016/01/10 22:11 87 4.bat
2016/01/11 11:40 93 5.bat
2016/01/10 22:44 95 src1.txt
2016/01/10 22:11 60 src2.txt
2016/01/10 22:29 51 table.txt
8 個のファイル 1,127 バイト
2 個のディレクトリ 23,891,244,032 バイトの空き領域