Windowsバッチファイルのサンプル(繰り返し処理)

同じ処理を何度も行う場合、繰り返し(ループ処理)を使用する。

バッチファイルで繰り返しを行う方法には、大きく分けて以下の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

タイトルとURLをコピーしました