FOR(繰り返し処理)
バッチファイルを作成していると、「複数のファイルに対して同じ処理を実行したい」「一定回数だけ処理を繰り返したい」といった場面に遭遇することがあります。
このような繰り返し処理を実現するのが FOR コマンドです。
この記事では、FOR コマンドの基本から各オプションの使い方まで、具体的なサンプルコードを交えて詳しく解説します。
FOR コマンドの基本構文
FOR コマンドの基本的な構文は以下の通りです。
FOR %%変数 IN (セット) DO コマンド
| 要素 | 説明 |
|---|---|
%%変数 | 繰り返しごとに値が格納される変数(1 文字、a〜z または A〜Z) |
(セット) | 処理対象となる値のリスト(スペースまたはカンマで区切る) |
コマンド | 各繰り返しで実行するコマンド |
コマンドプロンプトで直接実行する場合は %変数(%が1つ)、バッチファイル内では
%%変数(%が2つ)を使用します。
基本的な使用例
複数の値を順番に処理する簡単な例を見てみましょう。
@echo off
setlocal
FOR %%i IN (りんご みかん ぶどう) DO (
echo %%i が選択されました
)
endlocal
セット内の値が順に変数 %%i に格納され、DO 以降のコマンドが実行されます。
ファイルを対象に繰り返す
ワイルドカードを使用すると、条件に一致するファイルを対象に繰り返し処理ができます。
@echo off
setlocal
FOR %%f IN (*.txt) DO (
echo ファイル: %%f
)
endlocal
カレントディレクトリ内の .txt ファイルがすべて処理されます。
/L オプション:数値範囲で繰り返す
/L オプションを使用すると、数値を変化させながら繰り返し処理を実行できます。
FOR /L %%変数 IN (開始値, 増分, 終了値) DO コマンド
| パラメータ | 説明 |
|---|---|
| 開始値 | ループの開始となる数値 |
| 増分 | 各繰り返しで加算される値 |
| 終了値 | ループの終了となる数値 |
1 から 5 まで繰り返す
@echo off
setlocal
FOR /L %%n IN (1, 1, 5) DO (
echo カウント: %%n
)
endlocal
10 から 2 刻みでカウントダウン
増分に負の値を指定すると、カウントダウンもできます。
@echo off
setlocal
FOR /L %%n IN (10, -2, 0) DO (
echo %%n
)
endlocal
/D オプション:ディレクトリを対象に繰り返す
/D オプションを使用すると、ファイルではなくディレクトリのみを対象に繰り返し処理を実行できます。
FOR /D %%変数 IN (パターン) DO コマンド
使用例
@echo off
setlocal
echo カレントディレクトリ内のフォルダ一覧:
FOR /D %%d IN (*) DO (
echo [DIR] %%d
)
endlocal
/R オプション:サブディレクトリを含めて再帰的に繰り返す
/R オプションを使用すると、指定したディレクトリ以下のすべてのサブディレクトリを含めて繰り返し処理を実行できます。
FOR /R [ルートパス] %%変数 IN (パターン) DO コマンド
ルートパスを省略した場合は、カレントディレクトリが対象になります。
使用例:すべての.txt ファイルを検索
@echo off
setlocal
echo すべての.txtファイルを検索中...
FOR /R %%f IN (*.txt) DO (
echo 発見: %%f
)
endlocal
大量のファイルがあるディレクトリで /R オプションを使用すると、処理に時間がかかる場合があります。
/F オプション:ファイルの内容を読み込んで繰り返す
/F オプションは最も強力なオプションで、テキストファイルの各行を読み込んで処理したり、コマンドの出力結果を処理したりできます。
FOR /F ["オプション"] %%変数 IN (入力) DO コマンド
テキストファイルの各行を処理
@echo off
setlocal
echo ファイルの内容を1行ずつ表示:
FOR /F %%line IN (data.txt) DO (
echo %%line
)
endlocal
オプションの指定
/F オプションでは、様々なオプションを指定できます。
| オプション | 説明 |
|---|---|
delims=文字 | 区切り文字を指定(デフォルトはスペースとタブ) |
tokens=番号 | 取得するトークンの位置を指定 |
skip=行数 | スキップする行数を指定 |
eol=文字 | 行末コメントの開始文字を指定 |
usebackq | バッククォートの解釈を変更 |
CSV ファイルを処理する例
@echo off
setlocal
echo 名前,年齢,都市 のCSVを処理:
FOR /F "tokens=1,2,3 delims=," %%a IN (users.csv) DO (
echo 名前: %%a / 年齢: %%b / 都市: %%c
)
endlocal
users.csv の内容が以下の場合:
田中,25,東京
佐藤,30,大阪
鈴木,28,名古屋
コマンドの出力結果を処理
バッククォート(`)でコマンドを囲むと、そのコマンドの出力結果を処理できます。
@echo off
setlocal
echo 現在のディレクトリ内のファイル数をカウント:
set count=0
FOR /F %%f IN ('dir /b /a-d') DO (
set /a count+=1
)
echo ファイル数: %count%
endlocal
変数の拡張属性
FOR コマンドの変数には、ファイルに関する様々な情報を取得するための拡張属性が用意されています。
| 拡張属性 | 説明 |
|---|---|
%%~f | 完全修飾パス名(フルパス) |
%%~d | ドライブ名のみ |
%%~p | パス名のみ(ドライブ名を除く) |
%%~n | ファイル名のみ(拡張子を除く) |
%%~x | 拡張子のみ |
%%~z | ファイルサイズ |
%%~t | ファイルの日時 |
使用例
@echo off
setlocal
FOR %%f IN (*.txt) DO (
echo ファイル: %%f
echo フルパス: %%~ff
echo ファイル名: %%~nf
echo 拡張子: %%~xf
echo サイズ: %%~zf バイト
echo.
)
endlocal
実践的なサンプルコード
複数ファイルの一括リネーム
@echo off
setlocal enabledelayedexpansion
set prefix=backup_
set count=1
FOR %%f IN (*.txt) DO (
set newname=%prefix%!count!%%~xf
echo %%f を !newname! にリネーム
ren "%%f" "!newname!"
set /a count+=1
)
echo 完了しました
endlocal
ログファイルの古いものを削除
@echo off
setlocal
echo 7日以上前のログファイルを削除します...
FOR /F "delims=" %%f IN ('forfiles /p "C:\logs" /s /m *.log /d -7 /c "cmd /c echo @path" 2^>nul') DO (
echo 削除: %%f
del "%%f"
)
echo 完了しました
endlocal
練習問題
まとめ
FOR コマンドは、バッチファイルでの繰り返し処理を実現する強力なコマンドです。
主なポイント:
- 基本構文:
FOR %%変数 IN (セット) DO コマンド /Lオプション:数値範囲での繰り返し(開始値, 増分, 終了値)/Dオプション:ディレクトリのみを対象に繰り返し/Rオプション:サブディレクトリを含めた再帰的な繰り返し/Fオプション:ファイル内容やコマンド出力の処理
これらのオプションを使い分けることで、複雑な繰り返し処理も効率的に記述できます。