同じ処理を何度も行う場合、繰り返し(ループ処理)を使用する。
バッチファイルで繰り返しを行う方法には、大きく分けて以下の2つがある。
・gotoコマンドを使用した方法
・forコマンドを使用した方法
まったく同じ処理を何度も行うような場合はgotoコマンド、指定した回数やファイルの分だけ繰り返しを行う場合はforコマンドなど、やりたいことによって使い分ける。
一定時間ごとに処理を繰り返し
以下のバッチファイル内には終了条件を設けてないので無限ループになる。
処理をやめたい場合は「Ctrl+C」を入力する。
@echo off setlocal rem 開始ラベル :start_label rem 指定した秒数待つ rem 「/nobreak」オプションでキー入力を無視する rem オプションが無いと、任意のキー入力で後続の処理が動く timeout /nobreak 5 echo 実行したい処理 goto start_label
集合の要素で繰り返し
@echo off
setlocal
rem 集合の要素でループ
rem ループ変数は「%%[アルファベット1文字]」で、大文字と小文字が区別される
rem 以下の場合は a~e で5回ループ
for %%i in (a b c d e) do (
echo ループ変数は %%i
)
pause
指定した回数だけ繰り返し
@echo off
setlocal
rem 遅延環境変数の展開を有効
rem これがないとif文やfor文内の変数が認識されない
setlocal enabledelayedexpansion
set count=0
rem ループ処理(「/l」オプション)
rem ループ変数は「%%[アルファベット1文字]」で、大文字と小文字が区別される
rem 以下の場合は 5から開始、1ずつ増加、9で終了
for /l %%i in (5, 1, 9) do (
rem if文やfor文内で変数を参照する場合は「!変数名!」
set /a count=!count!+1
echo ループ !count! 回目
echo ループ変数は %%i
echo.
)
rem if文やfor文の外なら「%変数名%」で動く
rem 「!変数名!」にしても動く
echo ループ完了 %count% 回
pause
ファイルやディレクトリを対象とした繰り返し
@echo off
setlocal
rem ループ処理(オプション指定なし)
rem 指定したディレクトリに存在するファイルの分だけ繰り返し
rem ディレクトリ部分の指定を省略した場合はカレントディレクトリ
for %%f in ("D:\work\*.txt" "D:\work\*.dat") do (
echo ファイルパス(ファイル名を含む) %%~dpnxf
echo ファイルパス(dpnxと同じ結果) %%~ff
echo ファイルパス(ファイル名は除く) %%~dpf
echo ファイル名(拡張子なし) %%~nf
echo ファイル名(拡張子あり) %%~nxf
)
rem ループ処理(「/r」オプション、ファイル指定)
rem 指定したディレクトリ(サブディレクトリを含む)に
rem 存在するファイルの分だけ繰り返し
for /r "D:\work" %%f in (*.txt) do (
echo ファイルパス(ファイル名を含む) %%~dpnxf
echo ファイルパス(dpnxと同じ結果) %%~ff
echo ファイルパス(ファイル名は除く) %%~dpf
echo ファイル名(拡張子なし) %%~nf
echo ファイル名(拡張子あり) %%~nxf
)
rem ループ処理(「/d」オプション)
rem 指定したディレクトリに存在するディレクトリの分だけ繰り返し
rem ディレクトリ部分の指定を省略した場合はカレントディレクトリ
for /d %%d in ("D:\work\*") do (
echo ディレクトリパス %%~dpnd
echo ディレクトリパス(dpnと同じ結果) %%~fd
echo ディレクトリ名 %%~nd
)
rem ループ処理(「/r」オプション、ディレクトリ指定)
rem 指定したディレクトリ(サブディレクトリを含む)に
rem 存在するディレクトリの分だけ繰り返し
for /r "D:\work" %%d in (.) do (
echo ディレクトリパス %%~dpnd
echo ディレクトリパス(dpnと同じ結果) %%~fd
echo ディレクトリ名 %%~nd
)
pause
テキストファイル内のデータを行単位で読んで繰り返し
@echo off
setlocal
set readFile=D:\work\test.txt
rem ループ処理(「/f」オプション)
rem ループ変数にはテキストファイルの各行の内容が代入されるが、
rem デフォルトだとスペースで区切られているところまでになる
rem ファイル内容が「aaaa bbbb cccc dddd」だったら、
rem ループ変数には「aaaa」の部分だけが入る
for /f %%a in (%readFile%) do (
echo %%a
)
rem 「tokens」指定で1列目、3列目、4列目を読み込む
rem 指定してない2列目は無視される
rem ループ変数は指定した値を基準にしてアルファベット順に割り当たる
rem ファイル内容が「aaaa bbbb cccc dddd」だったら、
rem ループ変数%%aに「aaaa」(スペースで区切った1列目の値)、
rem ループ変数%%bに「cccc」(スペースで区切った3列目の値)、
rem ループ変数%%cに「dddd」(スペースで区切った4列目の値)が入る
for /f "tokens=1,3,4" %%a in (%readFile%) do (
echo 1列目 %%a
echo 3列目 %%b
echo 4列目 %%c
)
rem 「tokens」の連番指定で1列目~4列目を読み込む
for /f "tokens=1-4" %%a in (%readFile%) do (
echo 1列目 %%a
echo 2列目 %%b
echo 3列目 %%c
echo 4列目 %%d
)
rem 「delims」で区切り文字を指定する
rem 以下の場合は
rem 「,(カンマ)」と
rem 「:(コロン)」と
rem 「 (スペース)」のいずれかで区切られる
rem delimsの末尾("の手前)にスペースを入れてないと、
rem スペースが区切り文字にならないので注意
for /f "tokens=1-4 delims=,: " %%a in (%readFile%) do (
echo 1列目 %%a
echo 2列目 %%b
echo 3列目 %%c
echo 4列目 %%d
)
rem 1行全てを読み込む
rem 「delims」で何も指定しない(区切り文字が無い)
for /f "delims=" %%a in (%readFile%) do (
echo %%a
)
rem 指定するファイルパス内にスペースがある場合、
rem 「usebackq」を指定して、ファイルパスを
rem "(ダブルクォーテーション)で囲う必要がある
for /f "usebackq delims=" %%a in ("%readFile%") do (
echo %%a
)
pause
