山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他for文(/F)
概要
このページは、Windowsのバッチファイルのfor文の/Fについて記述します。
for /F オプション %%変数名 in (ファイル名) do コマンド名
/Fはファイルまたはコマンドの実行結果を行単位で変数に読み込み繰り返し処理を行えます。
変数名は英字で1文字でなければなりません。
オプションには以下の指定ができます。
バッククォートは日本語109キーボードでは以下の様にすると入力できます。
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コマンドの実行結果を代入 |
動作環境
以下の環境で動作を確認しました。
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
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)を前置して文字として認識させます。行末の^はコマンドが次の行へ続くことを示しています。
出力をリダイレクトして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で標準出力に出力しています。
ただし空行は無視されます。
ディフォルトではタブとスペースで列が区切られるので、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\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で標準出力に変数を出力しています。
空行も無視されます。
ディフォルトではタブとスペースで列が区切られるので、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で出力します。
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 バイトの空き領域
Copyright (C) 2012 山本ワールド All Rights Reserved.