バッチファイル
バッチファイルとはなにか
バッチファイル(batch file)という用語はDOSの世界独自の用語である。Unix/Linuxではシェル(sh、csh、bash、tcshなど)が使えて、インストーラやよく使う決まった手順をテキストファイルに書いておけば、 そのファイル名で呼び出せる。それにかわるものとして、機能的にはだいぶ落ちるのだが、DOSの世界にはバッチファイルというものが存在する。
仕様がコンパクトなためか、あるいは使う人が少ないのか、バッチファイルについての本はきわめて少ない。 WindowsではインストーラをGUIを駆使した超簡単なものにする習慣ができてしまい、パッケージ製品などではバッチファイルをほとんど使わなくなってしまったためもあるだろう。しかし、バッチファイルは個人的に使ってこそ光る。
一言で言えば、バッチファイルとはDOSのコマンドを羅列したファイルである。
@echo off cd \bcc\src bcc32 sample.c sample
普段DOSプロンプトで一連のコマンドを連続して打ち込むことが多い場合、上記のようにmybatch.batに書いておき、
C:\>mybatch
とだけ打てば、中身を順次実行してくれる。ただし、カレントディレクトリにない場合、パスが通っている必要がある(環境変数の設定方法参照)。
バッチファイルの実際
バッチファイルには、コマンドやプログラム名以外にもいくつかの文法が書ける。簡易スクリプト言語といってよいだろう。
■ if文
以下の3パターンがある。
if errorlevel <値> <コマンド> --直前のコマンドの終了コードを判定
if exist <ファイル名> <コマンド> --ファイルの有無を判定
if <文字列1>==<文字列2> <コマンド> --文字列の一致を判定
それぞれの判定文を否定するにはnotをつける。
if not errorlevel <値> <コマンド>
if not exist <ファイル名> <コマンド>
if not <文字列1>==<文字列2> <コマンド>
sample if errorlevel = 2 echo 失敗しました if exist c:\bcc\src\sample.c echo ファイルが存在します if %1=="no" exit
■ call文
バッチファイルから別のバッチファイルを呼び出すときに使用する。直接呼び出すと制御が戻ってこない。また、バッチファイル内のラベルに制御を飛ばすときにも使用する。
call subbatch1
■ for文
for文といえば繰り返し。
for %%A in (*.tmp *.bak) do delete %%A
上記の例はカレントディレクトリの拡張子tmpまたはbakなファイルをすべて削除する。%%A、%%B…などは変数。この場合、該当するファイル名が順次入る。
■ goto文
goto :LABEL : : :LABEL
コロンのうしろにラベルを書く。if文と組み合わせるのが常道。
sample if errorlevel 2 goto :LABEL echo 成功しました exit :LABEL echo 失敗しました
■ rem文
rem これは実行されません
要するにコメント文。長いバッチファイルには必須だ。
■ パラメタ
バッチファイル起動時にパラメタを渡すことができる。
C:\>mybatch sample2
このときのパラメタsample2は、バッチファイルの中では%1で表せる。
@echo off cd \bcc\src bcc32 %1.c %1
パラメタは9個まで指定できる。それ以上必要な場合はSHIFTを使えば番号をずらすことができる。
@echo off cd \bcc\images copy %1.gif %2.gif shift copy %1.gif %2.gif
Unixな人へ:シェルでは$1なので混同しないように。
■ 環境変数の引用
%変数名%で呼び出せる。
echo クラスパスは%CLASS_PATH%です。 set LIB_DIR=C:\bcc\lib cd %LIB_DIR%
バッチファイルの語源
batchとはメインフレームでの「一括処理」のこと。「バッチジョブを夜間に流す」などという。要するに即時処理ではなく大量のデータをトランザクション処理することである。一例としてあげると、誰かが預金をしたとき、口座にデータが追加されるのが即時処理、月末にすべての銀行口座から利息を計算するのが一括処理である。
バッチという言葉をここから借りてきて、DOSで使用しているわけである。