Windowsバッチファイルとは、コマンドを記述したファイルである。拡張子は .bat か .cmd である。
バッチファイル実行時にパラメータ(引数)を指定できる。バッチファイル中では、n番目の引数を %n で参照できる。n は0から9までの数で、%0 はバッチファイル名、%1 から %9 は1番目の引数から9番目の引数を表す。
バッチのファイル名と引数を表示するバッチの例を示す。
@echo off
echo バッチファイル名 %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
上記バッチの実行結果は次のとおり。
C:\> example.bat arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9
バッチファイル名 example.bat
引数1 arg1
引数2 arg2
引数3 arg3
引数4 arg4
引数5 arg5
引数6 arg6
引数7 arg7
引数8 arg8
引数9 arg9
C:\>
バッチファイルのコマンドは大文字と小文字を区別しない。
コマンド | 説明 |
---|---|
@ | プロンプトの出力とコマンドのエコーを抑制する。 |
& | 複数のコマンドを続けて実行する。(UNIXシェルの ; と同じ) |
( ) | 複数のコマンドをひとつのセットとする。(IFやFORで使用) |
|| | 前のコマンド結果が失敗なら、次のコマンドを実行する。 |
&& | 前のコマンド結果が成功なら、次のコマンドを実行する。 |
^ | 次の行へ続く。(UNIXシェルの \ と同じ) |
CALL |
他のバッチファイルを呼び出す |
FOR |
コマンドを繰り返し実行する |
GOTO |
指定したところへ制御を移す |
IF |
条件分岐 |
REM |
コメント |
バッチファイル実行中、コマンドライン(プロンプトと実行するコマンド)が標準出力に出力される。
C:\work>type sample.cmd
date /t
C:\work>sample.cmd
C:\work>data /t
2009/02/04
C:\work>
バッチファイル実行中にコマンドラインを出力させたくない場合、2通りのやり方がある。
ひとつは、コマンドの前にアットマーク記号を付ける方法である。コマンドの前にアットマーク記号が付いた場合、そのコマンドはコマンドラインが出力されない。バッチファイル中の特定のコマンドのみ、コマンドラインを出力させない場合に使用する。
C:\work>type sample.cmd
@date /t
C:\work>sample.cmd
2009/02/04
C:\work>
もうひとつは、echo offコマンドを実行する方法である。echo offを実行すると、それ以降のコマンド実行時にコマンドラインは出力されない。バッチファイル中の連続する複数のコマンドでコマンドラインを出力させない場合に使用する。
C:\work>type sample.cmd
echo off
date /t
C:\work>sample.cmd
C:\work>echo off
2009/02/04
C:\work>
この場合、echo offコマンド自体のコマンドラインが出力されるが、これを抑制したければ @echo off とする。
C:\work>type sample.cmd
@echo off
date /t
C:\work>sample.cmd
2009/02/04
C:\work>
echo offを実行した後、再びコマンドラインを出力させたい場合はecho onコマンドを実行する。
バッチファイルの出力で改行を行なうには、echoコマンドに続けてドット(ピリオド)を指定する。
echo.
echoとドットの間に空白を入れてしまうと、ドットが出力されてしまうことに注意。
CALLは、バッチ・プログラムから他のバッチプログラムを呼び出すコマンドである。
CALL path [arg...]
CALL :label [arg...]
CALLでラベル名を指定した場合、バッチ・プログラムの最後に到達するか、EXIT /B
が出現すると、呼び出し元へ制御が戻る。
@echo off
echo 処理1
call sub
:sub
echo 処理2
上記のバッチ・プログラムの場合、call sub
で制御が:sub
に移り、echo 処理2
が実行される。バッチ・プログラムの最後に到達すると、call sub
の次の行に制御が戻る。2回目のecho 処理2
が実行されると、バッチ・プログラムの最後に到達する。今度はCALLで呼ばれているわけではないので、バッチ・プログラムが終了する。
WindowsコマンドプロンプトのFORコマンドは、UNIXのsed(ストリームエディタ)のような機能も併せ持つ。
FOR /F ["option"] %var IN (fileset) DO command [arg...]
入力行の特定のトークンだけを抽出する場合、tokensオプションを指定する。tokensオプションには抽出するトークンの番号を指定する。
tokens=2
複数の番号を指定するときは、カンマで区切って指定する。
tokens=1,3,4
連続する複数の番号を指定するときは、最初の番号と最後の番号をハイフンで連結して指定することもできる。
tokens=2-5
入力ファイルmember.txtの各行から2番目のトークンだけを抽出して出力する例を次に示す。
C:\>TYPE member.txt
first-name last-name age
umeda erika 17
yajima maimi 17
nakajima saki 15
C:\>FOR /F "tokens=2" %i IN (member.txt) DO @echo %i
last-name
erika
maimi
saki
ファイル先頭の数行をスキップすることもできる。スキップした行は処理対象外となる。ファイル先頭行をスキップするには、skipオプションを指定する。skipオプションには、スキップする行数を指定する。
skip=2
入力ファイルmember.txtの2行目以降から2番目のトークンだけを抽出して出力する例を次に示す。
C:\>TYPE member.txt
first-name last-name age
umeda erika 17
yajima maimi 17
nakajima saki 15
C:\>FOR /F "skip=1 tokens=2" %i IN (member.txt) DO @echo %i
erika
maimi
saki
GOTOは、バッチ・プログラム内の指定した位置へ制御を移すコマンドである。
GOTO :label
GOTO :EOF
:EOF
は特別なラベル名で、バッチ・プログラムの最後を表す。バッチ・プログラム内に:EOF
というラベルを定義する必要はない。IFは条件が真のとき、コマンドを実行する制御文である。
IF condition command
パス名など空白文字を含む場合、{ } で囲む。
IF "%1" == "" goto usage
IF {%2} == "" goto usage
REMはコメントである。
REM comment
rem 日付を表示する
date /t