チャポケのブログ

勉強したことをまとめておく。

Windowsバッチ for 繰り返し制御

for 基本形

for文は、次のような形で記述する。

for (オプション) %%英字1文字 in (繰り返し対象) do (処理コマンド)

(オプション)in (繰り返し対象)によって、どのように繰り返すかが決まり、
%%英字1文字が繰り返し変数となり、
(処理コマンド)が繰り返される処理内容になる。
%%英字1文字は、(処理コマンド)の中だけで有効である。

for /l : 指定回数繰り返し

for /l で、指定した回数の繰り返し制御ができる。
in (繰り返し対象)は、in (開始値, 増分値, 終了値)と記述する。
増分値は、負の数も設定可能。

echo in (0, 1, 4) の場合
for /l %%a in (0, 1, 4) do (
  echo a=%%a
)

echo in (2, 3, 8) の場合
for /l %%a in (2, 3, 8) do (
  echo a=%%a
)

echo in (3, -1, 0) の場合
for /l %%a in (3, -1, 0) do (
  echo a=%%a
)
in (0, 1, 4) の場合
a=0
a=1
a=2
a=3
a=4
in (2, 3, 8) の場合
a=2
a=5
a=8
in (3, -1, 0) の場合
a=3
a=2
a=1
a=0

for オプション無し : ファイル対象繰り返し

for オプション無しでは、ファイルを対象に繰り返し制御ができる。
in (繰り返し対象)は、in (ファイル名)と記述する。
ファイル名は、ワイルドカードを使って記述する。
*」は1文字以上の任意の文字列で、「?」は任意の1文字として記述する。
ファイル名を相対パスで記述した場合は、カレントディレクトリから相対パスで示したファイルが、
ファイル名をフルパスを記述した場合は、その記述通りのファイルが、繰り返しの対象となる。

rem カレントディレクトリに
rem a1.txt, b2.txt, c2.txt があるとして、
echo in (*.txt) の場合
for %%f in (*.txt) do (
  echo file=%%f
)

echo in (?2.txt) の場合
for %%f in (?2.txt) do (
  echo file=%%f
)

rem ディレクトリC:\dirAに
rem aaa.txt, bbb.txt があるとして、
echo in (C:\dirA\*.txt) の場合
for %%f in (C:\dirA\*.txt) do (
  echo file=%%f
)
in (*.txt) の場合
file=a1.txt
file=b2.txt
file=c2.txt
in (?2.txt) の場合
file=b2.txt
file=c2.txt
in (C:\dirA\*.txt) の場合
file=C:\dirA\aaa.txt
file=C:\dirA\bbb.txt

for /d : ディレクトリ対象繰り返し

for /d では、ディレクトリを対象に繰り返し制御ができる。
これは、for オプション無しディレクトリ版だと思えばよい。

rem カレントディレクトリに
rem ディレクトリdirAA, dirBA, dirC2 があるとして、
echo in (dir*) の場合
for /d %%d in (dir*) do (
  echo directory=%%d
)

echo in (dir?A) の場合
for /d  %%d in (dir?A) do (
  echo directory=%%d
)
in (dir*) の場合
directory=dirAA
directory=dirBA
directory=dirC2
in (dir?A) の場合
directory=dirAA
directory=dirBA

for /r ディレクトリパス : ディレクトリ配下(サブ含む)のファイル/ディレクトリ対象繰り返し

for /r ディレクトリパスは、ディレクトリパス配下(サブディレクトリ含む)のファイルを対象に繰り返し制御ができる。
for /rだけでディレクトパスを記述しないと、カレントディレクトリ配下(サブディレクトリ含む)のファイルを対象に繰り返し制御ができる。
繰り返し変数の%%英字1文字は、フルパスの文字列となる。

for /r C:\test %%f in (*.txt) do (
  echo file=%%f
)
file=C:\test\a1.txt
file=C:\test\b2.txt
file=C:\test\c2.txt
file=C:\test\aaa\dd.txt
file=C:\test\dirAA\aa_1.txt
file=C:\test\dirAA\aa_2.txt


また、in (繰り返し対象)を、in (.)と記述した場合は、
ディレクトリパス配下(サブディレクトリ含む)のディレクトリを対象に繰り返し制御ができる。

for /r C:\test %%d in (.) do (
  echo directory=%%d
)
directory=C:\test\.
directory=C:\test\aaa\.
directory=C:\test\dirAA\.
directory=C:\test\dirAA\.