HOWTO · Batch
バッチ スクリプトの FOR ループ
Windows の cmd.exe にある FOR コマンドを使い、バッチ ファイルでリスト、数値範囲、フォルダー、ファイル、解析したテキスト、引数を反復処理します。
このページの内容
.bat または .cmd ファイルでは、FOR と %%I のような二重パーセントのループ変数を使い、各項目に対してコマンドを一度実行します。対話的なコマンド プロンプトでは %I のようにパーセントを一つだけ使うため、この違いがコピーした FOR コマンドが失敗する主な理由です。
FOR は固定リスト、数値範囲、フォルダー、ファイル、解析済みテキスト、またはスクリプトへ渡した引数を反復できます。以下の例は cmd.exe 構文を使い、出力を小さくしているので、必要な形式を一つずつ変更できます。
リストまたは一致したファイルを反復する
ループ変数は FOR の後、項目は IN の後、コマンドは DO の後に置きます。空白を含む可能性があるパスは引用符で囲み、コマンドに完全修飾パスが必要なときは %%~fI を使います。
@echo off
FOR %%I IN (red green blue) DO echo %%I
出力:
red
green
blue
現在のフォルダーにある一致ファイルを処理するには、固定リストを ("*.txt") のようなワイルドカードに置き換えます。括弧により一致した各パスが一つの項目になり、空白を含むファイル名でも安全です。
FOR /L で数える
FOR /L は (開始,増分,終了) を使います。増分で到達できる場合は終了値も含まれます。降順の範囲には負の増分が必要であり、正の増分で逆向きには数えられません。
@echo off
FOR /L %%I IN (5,-2,1) DO echo %%I
出力:
5
3
1
この形式は再試行、番号付きファイル、予測できる数列を持つ処理に役立ちます。ループが実行されると考える前に、方向と増分の符号を確認してください。
フォルダーとファイルを列挙する
パターンに一致するフォルダーには FOR /D を使います。FOR /R ルート はルートとそのサブフォルダーからファイルを検索します。%%~nx 修飾子は一致項目の名前と拡張子だけを出力するため、例の出力は絶対パスに依存しません。
@echo off
FOR /D %%D IN (demo\*) DO echo DIR %%~nxD
FOR /R demo %%F IN (*.txt) DO echo FILE %%~nxF
出力:
DIR one
DIR two
FILE first.txt
FILE second.txt
FOR /R は再帰的に検索するので、広いワイルドカードでは予想以上のファイルを対象にすることがあります。まず echo で一致名を確認し、次にファイルを変更するコマンドへ置き換えてください。
FOR /F でテキストを解析する
FOR /F はファイル、引用した文字列、または別コマンドの出力から行を読みます。既定の区切り文字は空白とタブなので、既知の区切り文字がある入力では tokens と delims を指定します。ここでは最初の二つのカンマ区切りフィールドが %%A と %%B になります。
@echo off
FOR /F "tokens=1,2 delims=," %%A IN (names.txt) DO echo %%A %%B
出力:
Ada Lovelace
Grace Hopper
FOR /F のオプションに "age=23" のような作り物の条件を使わないでください。代表的な入力で解析句を試し、空行は既定で飛ばされることも覚えておきます。
引数を処理し、ループを入れ子にする
%* はバッチ ファイルへ渡されたすべての引数を表します。入れ子の FOR ループは二つの集合を組み合わせられますが、各レベルでは別のループ変数を使います。括弧内で環境変数を変更する場合は遅延展開を有効にし、%name% ではなく !name! で値を読みます。
@echo off
FOR %%A IN (%*) DO echo ARG %%A
FOR %%I IN (1 2) DO FOR %%J IN (A B) DO echo PAIR %%I-%%J
example.bat first second として実行したときの出力:
ARG first
ARG second
PAIR 1-A
PAIR 1-B
PAIR 2-A
PAIR 2-B
バッチ ファイルは Windows の小さな自動化作業に実用的です。複雑なデータ構造、堅牢なエラー処理、またはクロスプラットフォームの作業には PowerShell の方が保守しやすいことが多く、どちらでも名前変更、コピー、削除の前に無害な echo ループから始めてください。