バッチファイルは、一連の作業をプログラム的に記載したテキストファイル。コマンドプロンプト上で、ファイル名を打ち込むと、バッチファイルに記載された一連の作業をパソコンが実行する。
-
バッチファイルの作成と実行
-
バッチファイル実行時に引数を渡す
-
バッチファイルで10個以上の引数を使う
-
バッチファイルで条件分岐を使う(IF)
-
バッチファイルで繰り返し処理を使う(FOR)
-
テキストファイルの内容を区切り文字でトークンに分解し繰り返し処理を使う(FOR)
-
バッチファイルから別のバッチファイルを呼び出す(CALL)
バッチファイルに関連するコマンド
-
エコー機能のON/OFFを切り替える(ECHO)
-
任意の文字列を表示(ECHO)
-
コメントの記述(REM)
-
キーが押されるまで処理を一時停止(PAUSE)
-
ラベルの位置へ制御を移す(GOTO)
-
バッチファイルを作成する
-
バッチファイルを実行する
バッチファイルを作成する
特定のディレクトリにあるファイルのバックアップを行うという一連の作業を考えてみる。例えば c:¥test へ移動し、サブディレクトリの back ディレクトリの中のファイルを削除したあと、カレントディレクトリにあるファイルをすべて back ディレクトリへコピーする、といったことを行うには次のように実行する。
cd c:¥test
del /q back
copy *.* c:¥test¥back
1回だけの作業であればいいのだが、毎日一回同じ作業を行うような場合、バッチファイルを使用すると便利だ。バッチファイルは実行したいコマンドをファイルに記述して保存したもので、バッチファイルを実行するとファイルに記述されたコマンドを上から順に実行してくれる。
バッチファイルを作成するにはメモ帳などのテキストエディタを起動し、実行したいコマンドを順に記述する。先ほどのコマンドを実行するのであれば次のように記述する。
作成したテキストファイルを保存する。バッチファイルとして保存する場合はファイルの拡張子を .bat で保存する。
バッチファイル名.bat
またバッチファイルの拡張子として .com も同じように使用することができる。
バッチファイル名.com
.bat と .com の違いは、.bat がWindows95など古いOSの頃から使用できるが、.com はWindowsNT系と呼ばれるOS(Windows10など)でのみ使用できる。現在のOSではどちらでも利用できるし、どちらを使って大きな違いはないので、これ以降ではバッチファイルの拡張子として .bat を使用する。
今回はファイル名 backup.bat として c:¥test ディレクトリに保存した。バッチファイルの作成はこれで完了だ。
バッチファイルを実行する
バッチファイルを実行するには、バッチファイルが置かれているディレクトリで バッチファイル名.bat または バッチファイル名 と実行する。先程作成したバッチファイルを実行する場合は backup.bat または backup と実行する。
backup
backup.bat
バッチファイルに記述した3つのコマンドが順に実行された。
バッチファイルはこのようにいくつかのコマンドの実行を繰り返し行いたい場合に便利だ。バッチファイルには繰り返し処理や条件分岐を記述してより複雑な処理を行わせることもできる。詳しい使い方は次のページ以降で解説する。
-
引数の指定とバッチファイル内で引数を参照する方法
-
引数の区切り文字の種類
-
区切り文字で使われる文字を引数の中で文字として使いたい場合
-
引数で渡された値から引用符(ダブルクォーテーション)を取り除く
-
すべての引数の値をまとめて参照する
引数の指定とバッチファイル内で引数を参照する方法
バッチファイルを実行するときにコマンドライン引数を指定するには次のように記述する。
バッチファイル 引数1 引数2 ...
複数の引数を指定する場合は区切り文字として半角スペース(他にもあり、後程説明する)で区切って記述する。
コマンドライン引数で渡された値は、バッチファイルの中で %1 ~ %9 という特別な記述を使って取り出して使うことができる(最大で9個の引数を参照できる。10個目以上の引数を使う場合は「
バッチファイルで10個以上の引数を使う
」を参照する)。1番目の引数は %1 、2番目の引数は %2 のように対応している。また %0 には実行しているバッチファイルの名前が入っている。
テストを行うために次のような簡単なバッチファイル argtest.bat を c:¥test に作成した。
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
ECHO コマンドは引数に指定した任意の文字列を表示することができるコマンドだ。例えば「%%0 = 」の部分は文字列なのでそのまま画面に表示される。(ECHO コマンドでは「%」は特別な文字のため、「%」を文字として表示する場合は「%%」と記述することになっている)。
それではバッチファイルを次のように実行する。
argtest.bat 東京都 男性 25
バッチファイルを実行すると、バッチファイルの中で実行しているバッチファイルの名前と3つの引数の値を参照して画面に表示する。
このようにバッチファイルを実行するときに引数を指定することで、バッチファイルの中で引数の値を参照して利用することができる。
引数の区切り文字の種類
バッチファイルで複数の引数を指定する場合、区切り文字としては半角スペースの他にセミコロン(;)、カンマ(,)、等号(=)が利用できる。
先程のバッチファイルは次のようにも実行することができる。
argtest.bat 東京都 男性 25
argtest.bat 大阪府,女性,23
argtest.bat 愛知県;男性;34
argtest.bat 埼玉県=女性=28
最後の等号を使ったものを実際に試してみる。
念のために確認してみると、区切り文字は混在しても使用できる。次の例では区切り文字としてカンマ(,)と等号(=)を使っている。
argtest.bat 東京都,男性=25
区切り文字で使われる文字を引数の中で文字として使いたい場合
引数として指定する値の中で、空白やカンマなど区切り文字として使われている文字を使いたい場合にはそのまま記述すると区切り文字として扱われてしまう。
例えば「東京都 港区」「男性」「3,425」という3つの値を引数として渡したい場合、次のように実行してしまうと意図した結果にはならない。
argtest.bat 東京都 港区 男性 3,425
バッチファイルを実行すると次のように実行される。なお先ほど試したように区切り文字は混在しても動作するので、引数で使われていない区切り文字を使用しても同じ結果となる。
区切り文字として使用する文字を引数の値の中で使用する場合には、値全体をダブルクォーテーションで囲いる。例えば「東京都 港区」「男性」「3,425」という3つの値を引数として渡したい場合は次のように実行する。
argtest.bat "東京都 港区" 男性 "3,425"
バッチファイルを実行すると、区切り文字が含まれている値も正しく引き渡すことができた。
引数で渡された値から引用符(ダブルクォーテーション)を取り除く
区切り文字を含んだ値を引数の値として使用したい場合、値全体をダブルクォーテーションで囲うことで値として引き渡すことができるが、その場合渡された値がダブルクォーテーション付きとなってしまう。
引数で渡された値からダブルクォーテーションを取り除いて受け取るには、「%1」などの代わりに「%~1」を使用する。
テストを行うために次のような簡単なバッチファイル argtest.bat を c:¥test に作成した。
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%~1 = %~1
echo %%2 = %2
echo %%~2 = %~2
echo %%3 = %3
echo %%~3 = %~3
それでは「東京都 港区」「男性」「3,425」という3つの値を引数として渡すように次のように実行する。
argtest.bat "東京都 港区" 男性 "3,425"
バッチファイルを実行すると、ダブルクォーテーションが含まれている値はダブルクォーテーションが取り除かれて受け取ることができた。
すべての引数の値をまとめて参照する
%0 から %9 までを使うことで引数毎に渡された値を参照することができるが、%* を使うと引数として入力された値を全部まとめて参照することができる。
テストを行うために次のような簡単なバッチファイル argtest.bat を c:¥test に作成した。
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%* = %*
それでは「次のように実行する。
argtest.bat 東京都 男性 25
バッチファイルを実行すると、%0 から %3 まではそれぞれの引数の値を参照するが、%* は引数に入力された値を全部まとめて参照する。
バッチファイルで引数を引き渡す方法について解説した。
-
10個目以降の引数を参照してみる
-
SHIFTコマンドの使い方
-
シフトする開始位置を指定する
10個目以降の引数を参照してみる
バッチファイルでは実行する時に記述する引数の数に制限はない。そのため、10個以上の引数を指定しても問題はない。(ただしコマンドラインの文字数の制限はあるようだ。詳しくは
Microsoft社の解説ページ
を参照)。
バッチファイル 引数1 引数2 ... 引数10 引数11
ただ引き渡された値を使用するバッチファイル側では、引数の値を取り出すのに使用する %1 ~ %9 が9個しかない(%0 は実行しているバッチファイルの名前を参照するのに使用される)。%10 や %11 のような記述は使用できないため、最大で9個までの引数の値しか参照できない。
%10 などが使用できないかどうかのテストを行うために次のような簡単なバッチファイル argtest.bat を c:¥test に作成した。
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
echo %%6 = %6
echo %%7 = %7
echo %%8 = %8
echo %%9 = %9
echo %%10 = %10
echo %%11 = %11
それではバッチファイルに引数を11個指定して次のように実行する。
argtest.bat A B C D E F G H I J K
実行した結果は次のようになる。
バッチファイル名が入る %0 と、引数の1番めから9番目に対応する %1 ~ %9 までは引数の値を参照できているが、%10 の値が A0 となっている。これは10番目の引数の値を参照したのではなく、1番目の引数の値を参照する「%1」+文字列の「0」と処理されたためだ。そのため、1番目の引数の値 A と文字列の 0 で A0 と表示されている。%11 の値も同じだ。
そこで10個以上の引数の値を参照したい場合には SHIFT コマンドを使用する。
SHIFTコマンドの使い方
SHIFT コマンドを使うと %0 から %9 で参照する引数を左にずらすことができる。書式は次の通りだ。
SHIFT [/n]
SHIFT コマンドを引数無しで実行すると、例えば %1 が参照する引数の値が1番目ではなく2番目のものとなる。同じように %2 は3番目の引数を参照するようになり、最後の %9 は10番目の引数を参照するようになる。結果として10番目の引数の値を参照することができるようになる。SHIFTコマンドをもう一度実行すれば、今度は %1 は3番目の引数を参照し、%9 は11番目の引数を参照する。
注意点として、SHIFT コマンドを実行すると %0 は1番目の引数を参照するにようなるが、もともと %0 で参照できていた実行しているバッチファイルの名前は参照できなくなる。SHIFT コマンドを実行するたびに %0 から %9 で参照する対象がずれていくので、対象でなくなった引数の値は参照することができなくなる。すべての引数の値をあとから使用したい場合は、参照できなくなり前に変数に格納しておく必要がある。
それでは SHIFT コマンドを試してみる。バッチファイルを次のように変更した。
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
echo %%6 = %6
echo %%7 = %7
echo %%8 = %8
echo %%9 = %9
echo.
shift
echo SHIFTを実行
echo.
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
echo %%6 = %6
echo %%7 = %7
echo %%8 = %8
echo %%9 = %9
echo.
shift
echo SHIFTを実行
echo.
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
echo %%6 = %6
echo %%7 = %7
echo %%8 = %8
echo %%9 = %9
それではバッチファイルに引数を11個指定して次のように実行する。
argtest.bat A B C D E F G H I J K
実行結果は次のようになる。
SHIFT コマンドを実行するたびに、%0 ~ %9 が参照する引数がずれていっていることが確認できる。
シフトする開始位置を指定する
SHIFT コマンドを実行すると %0 から %9 で参照する引数を左にずれるが、SHIFT コマンドを実行する時に「/開始位置」オプションを指定することで、左へずれる引数の開始位置を指定できる。例えば「/3」と指定した場合、SHIFT コマンドを実行すると %3 は3番目ではなく4番目の引数を参照するようになるが、%0 ~ %2 については変更がない。
それでは試してみる。バッチファイルを次のように変更した。
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
echo %%6 = %6
echo %%7 = %7
echo %%8 = %8
echo %%9 = %9
echo.
shift /3
echo SHIFT /3 を実行
echo.
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
echo %%6 = %6
echo %%7 = %7
echo %%8 = %8
echo %%9 = %9
それではバッチファイルに引数を11個指定して次のように実行する。
argtest.bat A B C D E F G H I J K
実行した結果は次のようになる。
%0 %1 %2 については SHIFT コマンドを実行したあとも参照する対象の引数が変わっていない。%3 以降が左へ1つずつずれていることが確認できる。
SHIFT コマンドを使ってバッチファイルで10個以上の引数を渡す方法について解説した。
-
IFコマンドの使い方
-
文字列と文字列を比較する
-
数値と数値を比較する
-
条件式で変数が未定義の場合にエラーにならないようにする
-
ファイルやディレクトリが存在するかどうかを調べる
IFコマンドの使い方
IF コマンドにはいくつか書式があるが、基本となる記述方法は次の通りだ。
IF 条件式 コマンド
条件式には文字列と文字列を比較したりファイルが存在するかどうかなどを記述する。この条件を満たす場合だけ条件式の後に記述されたコマンドが実行される。
条件式を満たす場合の他に満たさなかった場合には別のコマンドを実行させることもできる。次のように記述する。
IF 条件式 コマンドA ELSE コマンドB
条件式が満たされる場合にはコマンドA、満たされなかった場合にはコマンドBが実行される。
また IF コマンドは括弧()を使って複数行に分けて記述することもできる。条件式が満たされた場合に複数のコマンドを実行したい場合などにはこちらの方が記述しやすいかもしれない。注意して頂きたいのは「(」の前と「)」の後には必ず半角スペースを記述する必要がある。
IF 条件式 (
コマンドA1
コマンドA2
) ELSE (
コマンドB1
コマンドB2
)
それでは条件式の記述の仕方をみていく。
文字列と文字列を比較する
条件式で文字列Aと文字列Bが等しいかどうかを判断するには次のように記述する。文字列Aと文字列Bが等しい場合にコマンドが実行される。
IF 文字列A==文字列B コマンド
条件式の前に NOT を記述すると文字列Aと文字列Bが等しくない場合にコマンドが実行される。
IF not 文字列A==文字列B コマンド
変数に格納されている値と比較する場合は次のように記述する。比較する文字列の部分も変数でも構わない。
IF %変数名%==文字列 コマンド
テストを行うために次のような簡単なバッチファイル if.bat を c:¥test に作成した。
@echo off
set answer=
set /p answer=本を英語で何と言いるか?
if %answer%==BOOK (
echo 正解だ!
) else (
echo 残念、不正解だ
)
バッチファイルを実行すると質問が表示されるので回答を入力する。
正しい回答を入力すると「正解だ!」と表示され、誤った回答をすると「残念、不正解だ」と表示される。
数値と数値を比較する
文字列と文字列を比較する場合、等しいかどうかだけではなく比較演算子を使って条件式が正しいかどうかの判断をすることができる。
IF 文字列A 比較演算子 文字列B コマンド
/I オプションを付けると大文字と小文字の区別を行わずに比較する。
IF /I 文字列A 比較演算子 文字列B コマンド
使用できる比較演算子は次のようなものがある。
この書式は文字列どうしで比較する場合にも使えるが、文字列Aと文字列Bがそれぞれ数字だった場合には、文字列が数値に変換されて比較されるため、数値と数値を比較するためにも使用することができる。
テストを行うために次のような簡単なバッチファイル if.bat を c:¥test に作成した。
@echo off
set answer=
set /p answer=年齢は何歳だか?
if %answer%==BOOK (
echo 正解だ!
) else (
echo 残念、不正解だ
)
バッチファイルを実行すると質問が表示されるので回答を入力する。
入力した数値が18以上かそうでないかによってそれぞれ回答が表示される。
条件式で変数が未定義の場合にエラーにならないようにする
条件式で変数に格納された値を比較する場合、変数が未定義だとエラーが発生する。先程のサンプルのようにユーザーが入力された値を変数に格納し、変数を文字列や数値と比較する場合などには注意が必要だ。
文字列と文字列で比較する時に使用したバッチファイルを実行したあと、何も入力せずに[Enter]キーを押すと、エラーが表示される。
このような場合は、条件式の左側と右側をそれぞれダブルクオーテーションで囲う。
@echo off
set answer=set /p answer=本を英語で何と言うか?
if
"%answer%"=="BOOK"
(
echo 正解だ!
) else (
echo 残念、不正解だ
)
バッチファイルを実行してみると、入力が省略された場合でもエラーとならない。
また IF コマンドの次の書式を使って変数が定義されているかどうかを判定することもできる。
IF DEFINED 変数 コマンド
IF NOT DEFINED 変数 コマンド
変数が定義されていれば条件式が真となりコマンドが実行される。NOT を付けた場合は変数が定義されていない場合に条件式が真となりコマンドが実行される。
この書式と GOTO コマンドを利用して、何も入力されなかった場合は入力をやり直すようにバッチファイルを書き換えてみる。
@echo off
:start
set answer=
set /p answer=本を英語で何と言うか?
if not defined answer (
echo 値を入力しなおする
goto start
)
if "%answer%"=="BOOK" (
echo 正解だ!
) else (
echo 残念、不正解だ
)
バッチファイルを実行したあと、質問が表示されたときに何も入力せずに[Enter]キーを押すと、メッセージを表示したあと改めて入力をうながする。
何か入力をしてから[Enter]キーを押せば、回答が正しいかどうかの判定をする。
ファイルやディレクトリが存在するかどうかを調べる
IF コマンドでは条件式としてファイルやディレクトリが存在するかどうかを記述できる書式が用意されている。
IF [NOT] EXIST ファイル名 コマンド
ファイル名に指定したファイルが存在する場合は条件式が真となりコマンドが実行される。ファイル名だけを記述した場合はカレントディレクトリ内にあるかどうかを探する。カレントディレクトリ以外のファイルを探す場合は絶対パス付きで指定する。
テストを行うために次のような簡単なバッチファイル if.bat を c:¥test に作成した。
@echo off
set answer=
set /p answer=ファイル名を入力する
if exist %answer% (
echo ファイルは存在する
) else (
echo ファイルは存在しない
)
バッチファイルを実行するとファイル名の入力待ちとなる。
入力したファイル名がカレントディレクトリに存在するかどうかを調べて対応するメッセージを表示する。
カレントディレクトリ内にあるサブディレクトリ名を入力した場合も存在した場合は条件式が真となる。ただファイルなのかディレクトリなのかは判別できない。
IF コマンドを使ってバッチファイルの中で条件分岐を行う方法について解説した。
演算子
|
意味
|
EQU
|
等しい
|
NEQ
|
等しくない
|
LSS
|
より小さい
|
LEQ
|
以下
|
GTR
|
より大きい
|
GEQ
|
以上
|
-
FORコマンドの使い方
-
数値を変化させて繰り返す
-
指定した複数のファイル名の分だけ繰り返す
-
カレントディレクトリにあるファイルの分だけ繰り返す
-
カレントディレクトリにあるディレクトリの分だけ繰り返す
-
サブディレクトリに含まれるファイルも含めて繰り返す
FORコマンドの使い方
FOR コマンドにはいくつか書式があるが、基本となる記述方法は次の通りだ。
FOR (オプション) %%変数 IN (セット) DO コマンド
繰り返し処理の流れは次の通りだ。セットにはファイルの一覧や数値の範囲を指定する。ここから1つ値を取り出し、変数に設定してからコマンドを一回実行する。そして次の値をセットから取り出し同じように変数に設定してコマンドを実行していく。セットから値を取り出し終われば繰り返し処理は終了だ。
FOR コマンドの中で使用する変数は、コマンドラインで使用する場合は %変数 と記述し、バッチファイルの中で使用する場合は %%変数 と記述する。変数名は任意のものではなく1文字のアルファベット(例えば n とか i など)を使う。大文字と小文字は区別される。
実行するコマンドについては括弧()をつけて複数行に分けて記述することもできる。
FOR (オプション) %%変数 IN (セット) DO (
コマンド1
コマンド2
)
それでは繰り返し処理の記述の仕方をみていく。
数値を変化させて繰り返す
最初に数値を開始から終了まで変化させて繰り返しを行う方法だ。次の書式を使う。
FOR /L %%変数 IN (開始,ステップ,終了) DO コマンド
セットには開始する数値、終了する数値、そして変化させる数値を指定する。例えば1から初めて10まで1つずつ変化させる場合は (1,1,10) となる。
(1,1,10) の場合
1,2,3,4,5,6,7,8,9,10
また8から初めて20まで2つずつ変化させる場合は (8,2,20) となる。
(8,2,20) の場合
8,10,12,14,16,18,20
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /l %%n in (1,1,10) do (
echo n = %%n
)
バッチファイルを実行すると変数 n に1から10までの数値を順に格納しながらコマンドを実行する。
指定した複数のファイル名の分だけ繰り返す
指定した複数のファイル名を順に変数に格納しながら繰り返しを行う。オプション無しの次の書式を使う。
FOR %%変数 IN (セット) DO コマンド
セットには複数のファイルを記述する。区切り文字としては半角スペース、カンマ(,)、セミコロン(;)、等号(=)が使用できる。
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for %%f in (note.txt memo.txt report.doc) do (
echo filename = %%f
)
バッチファイルを実行すると変数 f に指定したファイル名を順に格納しながらコマンドを実行する。
ワイルドカードを使用せずにファイル名を指定した場合は、セットに指定した文字列を順に変数に格納しながら繰り返しを行うだけなので、セットに記述するものはファイル名ではなく単なる文字列でも構わない。
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
set answer=
set /p answer=曜日を1つ答えてください
for %%f in (Sun Mon Tue Wed Thu Fri Sat) do (
if %answer%==%%f (
echo 正解だ!
goto end
)
)
echo 不正解でした
:end
バッチファイルを実行すると質問が表示されてユーザーからの回答待ちになる。
繰り返し処理のなかで、IF コマンドを使って入力された値とセットに指定した文字列と順に比較する。一致するものがあればメッセージを表示して終了する。最後まで一致しなかった場合は別のメッセージを表示して終了する。
IF コマンドの使い方については「
バッチファイルで条件分岐を使う(IF)
」を参照。
カレントディレクトリにあるファイルの分だけ繰り返す
先程は複数のファイルを列挙して指定したが、カレントディレクトリにあるワイルドカードを使って指定したファイルを順に取り出して繰り返し処理を行うこともできる。
FOR %%変数 IN (セット) DO コマンド
例えばカレントディレクトリにある拡張子が .txt のファイルを順に取り出して繰り返しを行うには次のように記述する。
FOR %%変数 IN (*.txt) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for %%f in (*.txt) do (
echo filename = %%f
copy %%f c:\test\backup > nul
)
バッチファイルを実行すると、カレントディレクトリにある拡張子が .txt のファイルを変数 f に順に格納しながらコマンドを実行する。今回はファイル名を画面に出力し、その後で指定したディレクトリにファイルをコピーしている。
カレントディレクトリにあるディレクトリの分だけ繰り返す
カレントディレクトリにあるワイルドカードを使って指定したディレクトリを順に取り出して繰り返し処理を行うこともできる。
FOR /D %%変数 IN (セット) DO コマンド
例えばカレントディレクトリにある d から始まるサブディレクトリを順に取り出して繰り返しを行うには次のように記述する。
FOR /D %%変数 IN (d*) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /d %%d in (*) do (
echo dirname = %%d
)
バッチファイルを実行すると、カレントディレクトリに全てのサブディレクトリを変数 d に順に格納しながらコマンドを実行する。
サブディレクトリに含まれるファイルも含めて繰り返す
指定したディレクトリに含まれるファイルに加えてサブディレクトリに含まれるファイルを含めてワイルドカードを使って指定したファイルを順に取り出して繰り返し処理を行うこともできる。
FOR /R [[ドライブ:]パス] %%変数 IN (セット) DO コマンド
パスを指定した場合はカレントディレクトリが対象となる。例えば D:¥test ディレクトリにある拡張子が .txt のファイルを順に取り出して繰り返しを行うには次のように記述する。
FOR /R D:¥test %%変数 IN (*.txt) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /r d:¥test %%f in (*.txt) do (
echo filename = %%f
)
バッチファイルを実行すると、指定したディレクトリおよびサブディレクトリにある拡張子が .txt のファイルを変数 f に順に格納しながらコマンドを実行する。
この書式を使う場合、セットにピリオド(.)だけを指定すると、対象のディレクトリを起点としたディレクトリツリーの情報が変数に格納されながら繰り返しが行われる。
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /r d:¥test %%d in (.) do (
echo dirname = %%d
)
バッチファイルを実行すると、指定したディレクトリおよびサブディレクトリのディレクトリ名を変数 d に順に格納しながらコマンドを実行する。
FOR コマンドを使ってバッチファイルの中で繰り返し処理を行う方法について解説した。
-
テキストファイルを読み込んで処理する
-
行毎に取得するトークンの位置と数を指定する
-
コメント行として処理される行頭の文字を指定する
-
トークンに分割する区切り文字を変更する
-
ファイルの行頭でスキップする行数を指定する
-
空白が含まれるファイル名を指定する
テキストファイルを読み込んで処理する
FOR コマンドにはいくつか書式があるが、テキストファイルを読み込んで処理する場合は次の書式を使う。
FOR /F ["オプション"] %%変数 IN (ファイル セット) DO コマンド
オプションなしで FOR コマンドを実行した場合、ファイルセットに記述したファイルを読み込み、最初に行ごとに分割する。そして行ごとにデフォルトの区切り文字である半角スペースとタブでトークンに分割し、最初に見つかったトークンを変数に読み込みながら繰り返し処理が行われる。
今回読み込むファイルとしてカレントディレクトリに address.txt を用意した。各行は半角スペースで区切りそれぞれ4つの項目の値が入力されている。
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f %%t in (address.txt) do (
echo token = %%t
)
バッチファイルを実行すると、指定したファイルを各行ごとに半角スペースでトークンに区切り、最初のトークンを変数 t に順に格納しながらコマンドを実行する。
区切り文字や各行ごとに取得するトークンの数はオプションで指定することができる。順に確認していく。
行毎に取得するトークンの位置と数を指定する
デフォルトでは各行毎に最初のトークンを取得して変数に格納していた。オプションを使うことで、行毎に何番目のトークンを取得するのかを指定することができる。
例えば各行の2番目のトークンだけを取得したい場合はオプションを次のように記述する。
FOR /F "token=2" %%変数 IN (ファイル セット) DO コマンド
各行から複数のトークンを取得することもできる。例えば各行の1番目、3番目、4番目のトークンを取得したい場合はオプションを次のように記述する。
FOR /F "token=1,3,4" %%変数 IN (ファイル セット) DO コマンド
範囲で指定することもできる。例えば各行の2番目から4番目のトークンを取得したい場合はオプションを次のように記述する。
FOR /F "token=2-4" %%変数 IN (ファイル セット) DO コマンド
複数のトークンを取得する場合、変数が自動的に追加される。例えば FOR コマンドで変数として %%i を指定した場合、3つのトークンを取得することにすると自動的に %%j と %%k が定義されて3つのトークンがそれぞれの変数に格納される(自動で決まる変数名は、指定した変数名のアルファベット順で次のアルファベットになる。3個以上の場合も同様だ)。
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f "tokens="1,3,4" %%t in (address.txt) do (
echo token = %%t, %%u, %%v
)
バッチファイルを実行すると、指定したファイルを各行ごとに半角スペースでトークンに区切り、1番目と3番目と4番目のトークンを変数 t 、変数 u 、変数 v に順に格納しながらコマンドを実行する。
取得するトークンを指定する時に最後にアスタリスク(*)を記述すると、最後に取得したトークンよりもあとのテキストがすべて変数に格納される。例えば次のように記述すると変数が3つ使用されて、最初の変数には1番目のトークン、2番目の変数には2番目のトークン、3番目の変数には2番目のトークンよりあとの行末までのテキストがすべて格納される。(アスタリスクの前にはカンマなどは不要だ)。
FOR /F "token=1,2*" %%変数 IN (ファイル セット) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f "tokens="1,2*" %%t in (address.txt) do (
echo token = %%t, %%u, %%v
)
バッチファイルを実行すると、指定したファイルを各行ごとに半角スペースでトークンに区切り、1番目と2番目のトークンを変数 t と変数 u に格納し、それ以降のテキストを変数 v に順に格納しながらコマンドを実行する。
コメント行として処理される行頭の文字を指定する
デフォルトでは行の先頭にセミコロン(;)が記述されている行はコメントとして無視される。例えば読み込むテキストファイルを次のように変更してみた。
このファイルを読み込み4つのトークンを表示するように記述したバッチファイルを実行してみると、行頭にセミコロンが記述された行は無視されていることが確認できる。
オプションを使うことで、コメントとして無視される行頭の文字を別の文字に変更することができる。例えば行頭にビックリマーク(!)がある行をコメント行としたい場合には次のように記述する。(指定できる文字は1文字だけだ)。
FOR /F "eol=!" %%変数 IN (ファイル セット) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f "eol=! tokens="1-4" %%t in (address.txt) do (
echo token = %%t, %%u, %%v, %%w
)
複数のオプションを記述する場合は半角スペースで区切って続けて記述する
また読み込むテキストファイルを次のように変更してみた。
バッチファイルを実行すると、行の先頭にビックリマークがない行に対して1番目から3番目のトークンを変数に順に格納しながらコマンドを実行する。行頭にセミコロンがある行はコメントとして扱われないのでセミコロンも文字の1つとして扱われている。
トークンに分割する区切り文字を変更する
トークンに分割する区切り文字はデフォルトでは半角スペースだが別の文字に変更することができる。例えば区切り文字をカンマ(,)にするには次のように記述する。
FOR /F "delims=," %%変数 IN (ファイル セット) DO コマンド
区切り文字を複数指定することもできる。例えば区切り文字としてカンマ(,)、半角スペース、セミコロン(;)の3つを指定するには次のように記述する。
FOR /F "delims=, ;" %%変数 IN (ファイル セット) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f "delims=, tokens=1-3" %%t in (address.txt) do (
echo token = %%t, %%u, %%v
)
また読み込むテキストファイルを次のように変更してみた。
バッチファイルを実行すると、行の先頭にビックリマークがない行に対して1番目から3番目のトークンを変数に順に格納しながらコマンドを実行する。行頭にセミコロンがある行はコメントとして扱われないのでセミコロンも文字の1つとして扱われている。
ファイルの行頭でスキップする行数を指定する
読み込むファイルの中で最初の数行を処理する必要がない場合はスキップすることができる。例えば最初の2行をスキップするには次のように記述する。
FOR /F "skip=2" %%変数 IN (ファイル セット) DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f "skip=2 tokens=1-3" %%t in (address.txt) do (
echo token = %%t, %%u, %%v
)
また読み込むテキストファイルを次のように用意した。
バッチファイルを実行すると、ファイルの最初の2行をスキップして3行目から繰り返し処理が実行されている。
空白が含まれるファイル名を指定する
読み込むファイル名に空白が含まれる場合、ファイル名をダブルクオーテーションで囲う必要がある。この時オプションとして usebackq を指定して次のように記述する。
FOR /F "usebackq" %%変数 IN ("ファイル名") DO コマンド
テストを行うために次のような簡単なバッチファイル for.bat を c:¥test に作成した。
@echo off
for /f "usebackq tokens=1-3" %%t in ("address test.txt") do (
echo token = %%t, %%u, %%v
)
また読み込むテキストファイルの名前を address test.txt と空白が含まれるファイル名にした。
バッチファイルを実行すると、空白が含まれるファイル名であっても問題なく処理することができた。
FOR コマンドを使ってテキストファイルの内容を読み込んでトークンに分割し繰り返し処理を行う方法について解説した。
-
CALLコマンドの使い方
-
別のバッチファイルを呼び出す
-
引数をつけて別のバッチファイルを呼び出す
-
環境変数ERRORLEVELを使って呼び出したバッチファイルから戻り値を受け取る
-
同じバッチファイル内の指定ラベルをサブルーチンのように呼び出す
CALLコマンドの使い方
CALL コマンドを使って他のバッチファイルを呼び出す場合には次の書式を使う。
CALL [ドライブ:][パス]ファイル名 [バッチパラメーター]
呼び出すバッチファイルのファイル名を指定する。バッチファイルを呼び出すときには引数を指定して呼び出すこともできる。
また CALL コマンドを使って同じバッチファイル内の指定したラベル以降の処理を呼び出す場合には次の書式を使う。
CALL :ラベル [引数]
呼び出すラベル名を指定する。引数を指定して呼び出すこともできる。
それぞれ確認していく。
別のバッチファイルを呼び出す
別のバッチファイルを呼び出す方法だ。例えばバッチファイル call2.bat を呼び出す場合には次のように記述する。
call call2.bat
CALL コマンドが実行された時の処理の流れは次のようになる。呼び出し元のバッチファイルで CALL コマンドが実行されると、呼び出されたバッチファイルが実行される。呼び出されたバッチファイルの末尾まで実行されるか EXIT コマンドが実行されると元のバッチファイルの CALL コマンドの次の行から実行される。
テストを行うために次のような簡単なバッチファイル call1.bat および call2.bat を c:¥test に作成した。
call1.bat
@echo off
echo 他のバッチファイルを呼び出する
call call2.bat
echo 他のバッチファイルから戻りた
call2.bat
@echo off
echo 他のバッチファイルから呼ばれた
exit /b
バッチファイル call1.bat を実行すると途中でバッチファイル call2.bat を呼び出する。バッチファイル call2.bat が実行されて最後に EXIT コマンド実行されると呼び出し元の CALL コマンドの次の行から実行される。
CALL コマンドを使うことで他のバッチファイルを呼び出した後、CALL コマンドの次の行から処理を再開することができる。
引数をつけて別のバッチファイルを呼び出す
CALL コマンドでバッチファイルを呼び出すときに引数をつけて呼び出すことができる。
CALL ファイル名 引数1 引数2 ...
呼び出されたバッチファイルでは、コマンドラインから引数付きでバッチファイルを実行した時の同じように %1 ~ %9 という特別な記述を使って取り出して使うことができる。(詳しくは「
バッチファイル実行時に引数を渡す
」を参照)。
テストを行うために次のような簡単なバッチファイル call1.bat および call2.bat を c:¥test に作成した。
call1.bat
@echo off
set para1=Tokyo
set para2=25
call call2.bat %para1% %para2%
call2.bat
@echo off
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
exit /b
バッチファイル call1.bat を実行すると途中でバッチファイル call2.bat を2つの引数を付けて呼び出する。バッチファイル call2.bat が実行され、引数で渡された値を取得して画面に表示する。
環境変数ERRORLEVELを使って呼び出したバッチファイルから戻り値を受け取る
CALL コマンドでは呼び出したバッチファイルから戻り値を受け取ることはできないが、呼び出したバッチファイルの最後で EXIT コマンドを実行することで環境変数 ERRORLEVEL に値を設定することができる。
EXIT /b 終了コード
※ EXIT コマンドの使い方については「
コマンドプロンプトまたはバッチファイルを終了(EXIT)
」を参照。
例えば ERRORLEVEL に 1 を設定して呼び出されたバッチファイルを終了するには次のように実行する。
exit /b 1
バッチファイルを呼び出した側は CALL コマンドを実行した次の行以降で環境変数 %ERRORLEVEL% を参照することで呼び出されたバッチファイル側で設定した値を確認することができる。
テストを行うために次のような簡単なバッチファイル call1.bat および call2.bat を c:¥test に作成した。
call1.bat
@echo off
call call2.bat
echo errorleverl = %errorlevel%
call2.bat
@echo off
echo ERRORLEVEL 1 を設定して終了する
exit /b 1
バッチファイル call1.bat を実行すると途中でバッチファイル call2.bat を呼び出する。バッチファイル call2.bat では終了時に EXIT コマンドを終了コード付きで実行する。CALL コマンドの次の行で環境変数 ERRORLEVEL の値を参照して画面に表示する。
このように CALL コマンドでは戻り値を受け取ることはできないが、環境変数 ERRORLEVEL を利用することで、バッチの呼び出したどのように終了したのかなど簡単な情報を知ることができる。
同じバッチファイル内の指定ラベルをサブルーチンのように呼び出す
CALL コマンドでは別のバッチファイルを呼び出すだけでなく、同じバッチファイル内の指定ラベルを呼び出すことができる。例えばラベル disp を呼び出すには次のように記述する。
CALL :disp
CALL コマンドを実行してラベルを呼び出すと、ラベルの次の行からコマンドが実行される。バッチファイルの末尾まで実行するか EXIT コマンドが実行されると CALL コマンドの次の行から実行される。
テストを行うために次のような簡単なバッチファイル call.bat を c:¥test に作成した。
@echo off
echo 同じバッチファイル内のラベルを呼び出する
call :disp
echo 呼び出しが終了した
goto :EOF
:disp
echo 同じバッチファイル内から呼び出された
exit /b
バッチファイルを実行すると同じバッチファイル内のラベルを呼び出する。ラベルの次の行からコマンドが実行され最後に EXIT コマンドが実行されると CALL コマンドの次の行から実行が行われる。
別のバッチファイルを呼び出した時と同じように同じバッチファイル内のラベルを呼び出すときに引数を指定して呼び出すことができる。使い方は他のバッチファイルを呼び出すときと同じだ。
テストを行うために次のような簡単なバッチファイル call.bat を c:¥test に作成した。
@echo off
set para1=Tokyo
set para2=25
call :disp %para1% %para2%
goto :EOF
:disp
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
exit /b
バッチファイルを実行すると同じバッチファイル内のラベルを引数付きで呼び出する。ラベルの次の行からコマンドが実行され引数で渡された値を取得して画面に表示する。
なお %0 には通常実行しているバッチファイルの名前が表示されるが、CALL コマンドでラベルを呼び出した時にはラベル名が格納される。
CALL コマンドを使って別のバッチファイルを呼び出したり同じバッチファイル内の指定したラベルをサブルーチンのように呼び出したりする方法について解説した。
-
ECHOコマンドの使い方(エコー機能のオン/オフ)
-
エコー機能とは
-
コマンドの前に@をつけてエコー機能をオフにする
-
ECHOコマンドを使ってエコー機能をオフにする
ECHOコマンドの使い方(エコー機能のオン/オフ)
実行したコマンドを画面に表示する機能をエコー機能という。ECHO コマンドを使用すると、エコー機能のオンとオフを切り替えることができる。書式は次の通りだ。
ECHO [ON | OFF]
それではエコー機能のオンとオフを切り替えて試してみる。
エコー機能とは
テストを行うために次のような簡単なバッチファイル echotest.bat を c:¥test に作成した。
cd c:¥test
dir
デフォルトではエコー機能はオンになっている。バッチファイルを実行すると次のように表示される。
エコー機能がオンになっていると、バッチファイルで実行された cd:¥test や dir など実行したコマンド(およびプロンプト)が画面に表示される。
場合によっては実行しているコマンドは表示せずに結果だけ表示したい場合もある。その場合はエコー機能をオフにする。エコー機能をオフにする方法は2つ用意されているのでそれぞれ確認してみる。
コマンドの前に@をつけてエコー機能をオフにする
エコー機能をオフにする1つ目の方法は実行するコマンドの前に @ を記述する。先程のバッチファイルを少し変更し、次のように各コマンドの前に @ を付けた。
@cd c:¥test
@dir
バッチファイルを実行すると次のように表示される。
実行されたコマンドが画面に表示されず、コマンドの実行結果だけが画面に表示された。
コマンド単位で指定できるので例えば cd:¥test だけ画面に表示させないようにすることもできる。先程のバッチファイルを次のように書き換えた。
@cd c:¥test
dir
バッチファイルを実行すると次のように表示される。
cd:¥test コマンドが実行されたことは表示されず dir コマンドが実行されたことは表示された。
ECHOコマンドを使ってエコー機能をオフにする
エコー機能をオフにする2つ目の方法 ECHO コマンドを使う方法だ。ECHO コマンドを使ってエコー機能をオフにすると、それ以降に実行されるコマンドは画面に表示されない。エコー機能をオフにするには次のように実行する。
echo off
先程のバッチファイルを少し変更し、最初に echo off を記述した。
echo off
cd c:¥test
dir
バッチファイルを実行すると次のように表示される。
実行されたコマンドが画面に表示されず、コマンドの実行結果だけが画面に表示された。ただエコー機能をオフにするために実行した echo off だけは画面に表示されてしまっている。ECHO コマンドが実行されたことも画面に表示させないようにするには1つ目の方法で使用した @ を ECHO コマンドの前に記述する。
@echo off
cd c:¥test
dir
バッチファイルを実行すると次のように表示される。
ECHO コマンドも含めて実行されたコマンドが画面に表示されず、コマンドの実行結果だけが画面に表示された。
ECHO コマンドを使ってエコー機能のオンとオフを切り替える方法について解説した。
-
ECHOコマンドの使い方(文字列の表示)
-
画面に文字列を表示する
-
空白行と特殊な文字を表示する
ECHOコマンドの使い方(文字列の表示)
ECHO コマンドを使用すると任意の文字列を画面に表示することができる。書式は次の通りだ。
ECHO [メッセージ]
引数には画面に表示する文字列を指定する。
画面に文字列を表示する
例えば画面に"バッチ処理を実行する"と表示するには次のようにバッチファイルに記述する。
echo バッチ処理を開始する
テストを行うために次のような簡単なバッチファイル echotest.bat を c:¥test に作成した。
echo バッチ処理を開始する
cd c:¥test
バッチファイルを実行すると次のように表示される。ECHO コマンドの引数に指定した文字列が画面に表示された。
デフォルトではエコー機能がオンになっているので実行された「echo バッチ処理を開始する」コマンドも画面に表示されている。文字列だけを画面に表示するには ECHO コマンドの前に @ をつけてエコー機能をオフにする(エコー機能については「
エコー機能のON/OFFを切り替える(ECHO)
」を参照)。
バッチファイルを次のように変更した。
@echo バッチ処理を開始する
cd c:¥test
バッチファイルを実行すると次のように表示される。今度は文字列だけが画面に表示されている。
空白行と特殊な文字を表示する
ECHO コマンドを使って空白の行を表示したい場合には ECHO コマンドの次にピリオド(.)を付けて実行する。ECHO コマンドとピリオドの間に空白などを入れない。
echo.
テストを行うために次のような簡単なバッチファイル echotest.bat を c:¥test に作成した。
@echo 空白行を表示する
@echo.
@echo 空白行を表示した
バッチファイルを実行すると次のように表示される。
ECHO コマンドを使ってパイプやリダイレクトの文字を表示したい場合には文字の前にキャレット(^)を付ける。キャレット自身を表示したい場合もキャレット付ける。またパーセント(%)を文字として表示したい場合は %% と記述する。
文字
|
バッチファイル内での記述方法
|
|
|
^|
|
<
|
^<
|
>
|
^>
|
&
|
^&
|
^
|
^^
|
%
|
%%
|
テストを行うために次のような簡単なバッチファイル echotest.bat を c:¥test に作成した。
@echo パイプ ^| やリダイレクト ^< ^> を表示する
@echo キャレット ^^ とアンパサンド ^& を表示する
@echo パーセント %% を表示する
バッチファイルを実行すると次のように表示される。
ECHO コマンドを使って任意の文字列を表示する方法について解説した。
-
REMコマンドの使い方
-
コメントを記述する
REMコマンドの使い方
REM コマンドを使用するとバッチファイルの中にコメントを記述することができる。書式は次の通りだ。
REM [コメント]
コメントはバッチファイルの中に記述するメモだ。画面に表示されることがないので、バッチファイルの作成日や目的などのメモなどを記述しておくことができる。
コメントを記述する
コマンドプロンプトの中で"作成日xx年xx月xx日、作成者 xxxx"とコメントを記述するには次のように記述する。
rem 作成日xx年xx月xx日、作成者 xxxx
エコー機能がオンになっていると REM コマンドも画面に表示される。エコー機能をオフにした後でコメントを記述するか、次のように REM コマンドの前に @ を記述する。(エコー機能については「
エコー機能のON/OFFを切り替える(ECHO)
」を参照)。
@rem 作成日xx年xx月xx日、作成者 xxxx
テストを行うために次のような簡単なバッチファイル remtest.bat を c:¥test に作成した。
@rem 作成日xx年xx月xx日、作成者 xxxx
cd c:¥test
バッチファイルを実行すると次のように表示される。
REM コマンドはコメントを残す以外に何も行わないので、実行するときは REM コマンドがあってもなくても変わりはない。
REM コマンドを使ってバッチファイル内にコメントを記述する方法について解説した。
-
PAUSEコマンドの使い方
-
処理を一時停止する
PAUSEコマンドの使い方
PAUSE コマンドを使用するとバッチ処理の実行を一時停止することができる。書式は次の通りだ。
PAUSE
何かキーが押されると処理を再開する。
処理を一時停止する
テストを行うために次のような簡単なバッチファイル pausetest.bat を c:¥test に作成した。
cd c:¥test
pause
dir
バッチファイルを実行すると上から順にコマンドが実行されていくが、PAUSE コマンドが実行されると処理が一時停止する。それでは実際にバッチファイルを実行してみる。
PAUSE コマンドが実行されると「続行するには何かキーを押する . . .」と表示されて処理が一時停止する。ここで何かキーを押すと停止していた処理が再開して PAUSE コマンドの次のコマンドから実行されていく。
実際の利用方法としては、例えばユーザー側で何らかの準備をしてもらい、準備ができたら何かキーを押して処理を再開するようなケースが考えられる。
PAUSE コマンドを使って処理を一時停止する方法について解説した。
-
GOTOコマンドの使い方
-
指定したラベルへ制御を移動する
-
あらかじめ作成済のEOFラベルを使う
GOTOコマンドの使い方
GOGO コマンドを使用すると指定したラベルの位置へ制御を移すことができる。書式は次の通りだ。
GOTO ラベル
GOTO コマンド実行されると引数に指定したラベルの位置へ制御が移りる。ラベルはバッチファイル内の任意の場所に次のように記述することができる。ラベルの行には他には何も記述することはできない。
:ラベル名
指定したラベルへ制御を移動する
テストを行うために次のような簡単なバッチファイル gototest.bat を c:\test に作成した。
@echo off
echo START
goto last
:first
echo FIRST
goto end
:last
echo LAST
goto first
:end
echo END
バッチファイルを実行すると最初に START が表示されたあと last ラベルへ移動する。次に LAST が表示されたあと今度は first ラベルへ移動する。そして FIRST を表示したあと end ラベルへ移動して END を表示してバッチファイルが終了する。
このようにラベルを使った制御の移動は、バッチファイの後の方へも前の方にも移動することができる。
今度は IF コマンドと組み合わせた使い方だ。テストを行うために次のような簡単なバッチファイル gototest.bat を c:\test に作成した。
@echo off
set answer=
set /p answer=英語で本はなんだか?
if %answer%==BOOK (
echo 正解だ
goto end
)
echo 不正解だ
:end
バッチファイルを実行すると質問が表示され入力待ちとなる。
正解を回答すると IF コマンドで指定したコマンドが実行されるが、そのあと GOTO コマンドによって end ラベルへ制御が移りバッチファイルが終了となる。
あらかじめ作成済のEOFラベルを使う
バッチファイル内で記述しなくても使用できるラベルとして EOF ラベルが用意されている。EOF ラベルはバッチファイルの一番最後を表し、GOTO コマンドの引数として :EOF を指定するとバッチファイルの最後に移動しバッチファイルが終了する。引数に指定する時は EOF ではなく :EOF と指定する点に注意する。
EOF ラベルを使って先ほどのサンプルを書き換えると次のようになる。
@echo off
set answer=
set /p answer=英語で本はなんだか?
if %answer%==BOOK (
echo 正解だ
goto :EOF
)
echo 不正解だ
バッチファイルを実行すると質問が表示され入力待ちとなる。
正解を回答すると IF コマンドで指定したコマンドが実行されるが、そのあと GOTO コマンドによって EOF ラベルへ制御が移りバッチファイルが終了となる。
このように EOF ラベルを使用すると、ラベルを記述しなくてもどこからでもバッチファイルの最後へ制御を移すことができる。