for /F "tokens=1-3 delims=/ " %%i in ('date /t') do SET DT=%%a%%b%%c
「in セット」の各要素に対して、指定された「do コマンド」を実行します。
FOR [オプション] %変数|%%変数 IN (セット) DO コマンド [コマンドパラメータ]
%変数 単一文字の置き換え可能な変数名を指定します。大文字小文字区別。
コマンドライン例:%i、バッチファイル例:%%i
(セット) オプションによって変わります。ファイル セットならワイルドカードできます。
コマンド 各ファイルごとに実行するコマンドを指定します。
コマンドパラメータ
指定されたコマンドのパラメータまたはスイッチを指定します。
コマンド拡張機能を有効にすると、次の FOR コマンドの追加形式がサポートされる
ようになります:
[ディレクトリ]
FOR /D %変数 IN (セット) DO コマンド [コマンドパラメータ]
セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
の一致を指定します。
サブディレクトリを再起検索しません
[サブディレクトリ]
FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンドパラメータ]
[ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
ます。/R の後にディレクトリが指定されていない場合は、現在の
ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
ディレクトリ ツリーの列挙だけを行います。
例: for /R %%i in (build.log) do echo %%i
%%i には、サブディレクトリのそれぞれに、build.log を付けたものが入ります。
例: for /R %%i in (build*) do echo %%i
カレントかサブディレクトリに、build から始まるファイルがあれば、%%i に入ります。
例: for /R %%i in (build.log) do if exist %%i echo %%i
カレントかサブディレクトリに、build.log のファイルがあれば、echo します。
[数値]
FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンドパラメータ]
セットは、ステップの量ごとに変化する開始から終了までの数列です。
たとえば、(1,1,5) は 1 2 3 4 5、(5,-1,1) は (5 4 3 2 1) という数列に
なります。
[ファイル][文字列][コマンド出力]
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメータ]
または usebackq オプションの場合:
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
[コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメータ]
ファイル名セットは、1 つ以上のファイル名です。各ファイルが開かれ、読み
取られ、処理されてから、ファイル名セットの次のファイルに進みます。処理
には、ファイルの読み取り、個々のテキスト行への分割と、0 個以上のトークン
への解析が含まれます。その後、変数値を見つかったトークン文字列に設定して、
for ループの本体が呼び出されます。既定では、/F は、各ファイルの各行から、
空白で区切られた最初のトークンを渡します。空白行はスキップされます。既定
の解析動作を変更するには、オプションの "オプション" パラメータを指定しま
す。これは、異なる解析オプションを指定する 1 つ以上のキーワードを含む、
引用符で囲まれた文字列です。キーワードは、次のとおりです:
eol=c - 行末のコメント文字を指定します (1 文字)。
skip=n - ファイルの先頭でスキップする行数を指定します。
delims=xxx - 区切り文字のセットを指定します。これは、既定の
区切り文字であるスペースとタブを置き換えます。
tokens=x,y,m-n - 各繰り返しに対して、各行から for 本体に渡すトー
クンを指定します。これにより、追加の変数名が割り当
てられます。m-n の形式は範囲で、m 番目から n 番目の
トークンを指定します。tokens= 文字列の最後の文字が
アスタリスクである場合は、追加の変数が割り当てられ、
最後のトークンが解析された後、行に含まれている残り
のテキストを受け取ります。
usebackq - 次の新しい表示形式を指定します。逆引用符で囲まれた
文字列がコマンドとして実行され、一重引用符で囲まれた
文字列がリテラル文字列コマンドになりファイル名セット
のファイル名を二重引用符で囲めるようになります。
例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
各行の 2 番目と 3 番目のトークンを for 本体に渡します。トークンは、カンマ
またはスペースで区切られています。for 本体の文が %i で 2 番目のトークン
を、%j で 3 番目のトークンを取得し、%k で 3 番目以降のすべてのトークンを
取得していることに注意してください。スペースを含むファイル名に対しては、
二重引用符でファイル名を引用する必要があります。この方法で二重引用符を使う
ためには、usebackq オプションを使わなければなりません。使わなければ、二重
引用符はリテラル文字列の定義として解釈され、解析されます。
%i は for 文で明示的に宣言され、%j と %k は tokens= オプションで暗黙的に
宣言されています。tokens= 行を使って 26 個までのトークンを指定できますが、
文字 'z' または 'Z' よりも高い変数を宣言することはできません。FOR 変数名は
単一の文字で、大文字と小文字を区別し、グローバルなものであり、一度にアクティ
ブにできるのは合計 52 個までです。
また、カッコで囲んだファイル名セットを一重引用符で囲み、文字列にすることに
より、即時の文字列に対する FOR /F 解析ロジックを使うこともできます。
これは、ファイルからの単一入力行として処理されます。
最後に、FOR /F コマンドを使って、コマンド出力を解析することができます。
カッコの中のファイル名セットを逆引用符で囲みます。この文字列は、コマンド
ラインとして子 CMD.EXE に渡されます。出力はメモリにキャプチャされ、ファイ
ルのように解析されます。
例:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
この例は、現在の環境の環境変数名を列挙します。
また、FOR 変数参照の置換も拡張されました。
次のオプション構文を使うことができます:
バッチファイルでは、 %I は %%I になります。
%I - ファイルのフルパス "c:\folder\file.txt"
%~I - すべての引用句 (") を削除して、I を展開します。 "c:\folder\file.txt"
%~fI - %I を完全修飾パス名に展開します。 "c:\folder\file.txt"
%~dI - %I をドライブ文字だけに展開します。 "c:"
%~pI - %I をパス名だけに展開します。 "\folder\"
%~nI - %I をファイル名だけに展開します。 "file"
%~xI - %I をファイル拡張子だけに展開します。".txt"
%~sI - 展開されたパスは短い名前だけを含みます。 "c:\folde~1\file~1.txt"
%~aI - %I をファイルの属性に展開します。 "--a------"
%~tI - %I ファイルの日付/時刻に展開します。 "2006/03/15 00:35"
%~zI - %I ファイルのサイズに展開します。 "283120"
%~$PATH:I - PATH 環境変数に指定されているディレクトリを
検索し、最初に見つかった完全修飾名に %I を
展開します。
環境変数名が定義されていない場合、または検索
してもファイルが見つからなかった場合は、この
修飾子を指定すると空の文字列に展開されます。
修飾子を組み合わせて、複合結果を得ることもできます:
%~dpI - %I をドライブ文字とパスだけに展開します。 "\folder\file"
%~nxI - %I をファイル名と拡張子だけに展開します。 "file.txt"
%~fsI - %I を完全なパスと短い名前だけに展開します。
%~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
検索して %I を探し、最初に見つかったファイル
のドライブ文字とパスだけに展開します。
%~ftzaI - %I を DIR コマンドの出力行のように展開します。
上の例の %I と PATH は、ほかの有効な値で置き換えることができます。
%~ 構文は、有効な FOR 変数名によって区切られます。%I のような大
文字の変数を使うと読み取りやすく、大文字と小文字を区別しない修飾子
との混乱を避けることができます。
「コマンド拡張機能を有効 にする(Xpではデフォルト)。/e:on
for /R %%i in (a.log) do @if exist "%%i" echo "%%i"
for /R %%i in (*.*) do echo 1 %%i 2 %%~i 3 %%~fi 4 %%~di 5 %%~pi 6 %%~ni 7 %%~xi
8 %%sfi 9 %%~ai 1 %%~ti 2 %%~zi
%I と %i は異なります。
下記は /R ありのときです。
/R なしでは、%I はファイル名だけ。
相対パスは得られません。
( ) の中にワイルドカードがあれば、ファイルまたはフォルダーがあるもののみマッチします。
( ) の中にワイルドカードが無ければ、ファイルの有無に関係なく全サブフォルダとマッチします。
/R はサブ フォルダー、/D はディレクトリのみ。
( ) の中に、絶対パスを指定することもできますが、/R を指定してもサブ フォルダーにマッチしません。
サブ フォルダーにもマッチさせたいときは、カレント フォルダーをそのフォルダーに移動して、ファイル名
またはフォルダー名を ( ) の中に指定してください。
%%i は、コマンドラインでは %i、バッチファイルでは %%i
%%i は、空白を含んだパスでも "" で囲まれていません。
%%i は、for /R オプションがあると、フル パスになり、無いと、ファイル名だけになります。
pushd ..
for /R %%i in (readme.txt) do (
if exist "%%i" (
echo %%i
if errorlevel 1 goto exit_for1
)
)
:exit_for1
echo.
echo done in %cd%
echo.
popd
関連
親フォルダの全サブフォルダにある readme.txt ファイルのパスを一覧する
set src_name=readme.txt
set src=folderX\%src_name%
pushd ..
for /R %%i in (%src_name%) do (
if exist "%%i" if not "%cd%\%src%"=="%%i" (
fc "%src%" "%%i"
if errorlevel 1 goto exit_for1
)
)
:exit_for1
echo.
echo done in %cd%
echo.
popd
set src_name=
set src=
..\folderX\readme.txt と、それ以外の readme.txt ファイルを比較する
%%~ni%%~xi
%%~di%%~pi
for /D /R %%i in (*) do @if exist "%%i" echo "%%i"
( ) を使うと、( ) の中で値を代入した環境変数を、同じ ( ) の中で参照できません。
ヘルプ表示
サンプル
サンプル
関連
for /D /R %%i in (*) do (
set return_value=%%i
set return_value_2=%return_value% !
)
set return_value=%return_value% !
たとえば、下記の return_value_2 に設定する値は、すぐ上で代入する前の return_value の値になります。
set return_value_2=%return_value%
次のように、for ブロックの中から call すれば、ブロックの外に出すことができ、代入した値をすぐに
参照できます。
:ExampleFunction
for /D /R %%i in (*) do (
call :ExampleFunction_Sub "%%i"
)
set return_value=%return_value%
goto :eof
:ExampleFunction_Sub
set return_value=%~1
set return_value=%return_value% !
goto :eof
call :ExampleFunction_Sub "%%i"
%~1