バッチファイルを使おう(初心者向け・バッチ呼び出し編)

1つのバッチファイルで全ての処理を簡潔出来ればいいのですが、世の中そう甘くはありません。どうしようもなくて複数のバッチファイルを使う必要がある場合に直面すると思います。簡単に言うと、バッチファイルからバッチファイルを呼び出すという状況です。今回は、バッチファイルの呼び出しについて紹介します。

バッチファイルの呼び出し方

バッチファイルの呼び出し方は1つではありません。基本的には次の3つの方法があります。

  • callコマンド
  • startコマンド
  • バッチファイル名を指定

コマンド名を見れば何となく想像がつくと思います。バッチファイル名の指定はそのままで、Aというバッチファイルの中に、Bというバッチファイル名を直接実行するだけです。尚、それぞれ異なる結果を持っているので、どれでも良いと言うわけでは無く、状況に応じて考える必要があります。

callコマンド

最初にcallコマンドを解説しますが、まずはDOS先生に尋ねてみましょう。コマンドプロンプトを起動して、以下を入力してEnterキーを押下します。

help call

すると、DOS先生からお返事を頂きます。

バッチ プログラムを別のバッチ プログラムから呼び出します。
CALL [ドライブ:][パス]ファイル名 [バッチパラメーター]
    バッチパラメーター   バッチ プログラムで必要なコマンド ライン情報を指定します。
コマンド拡張機能を有効にすると、CALL は次のように変更されます:
CALL コマンドは、CALL のターゲットとしてラベルを受け付けるようになります。
構文は、次のとおりです:
    CALL :ラベル 引数
指定された引数で新しいバッチ ファイル コンテキストが作成され、指定されたラベルの次の文に制御が渡されます。
バッチ スクリプト ファイルの最後に 2 回到達することによって、2 回 "終了" する必要があります。
1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。
2 回目に、バッチ スクリプトが終了します。
バッチ スクリプトから "戻る"ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。
また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように変更されました:
    %* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
        %5 など) を参照します。
    バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文を使うことができます:
        %~1         - すべての引用句 (") を削除して、%1 を展開します。
        %~f1        - %1 を完全修飾パス名に展開します。
        %~d1        - %1 をドライブ文字だけに展開します。
        %~p1        - %1 をパスだけに展開します。
        %~n1        - %1 をファイル名だけに展開します。
        %~x1        - %1 をファイル拡張子だけに展開します。
        %~s1        - 展開されたパスは、短い名前だけを含みます。
        %~a1        - %1 をファイル属性に展開します。
        %~t1        - %1 をファイルの日付/時刻に展開します。
        %~z1        - %1 をファイルのサイズに展開します。
        %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、最初に見つかった完全修飾名に %1 を展開します。環境変数名が定義されていない場合、または 検索してもファイルが見つからなかった場合は、この修飾子を指定すると空の文字列に展開されます。
    修飾子を組み合わせて、複合結果を得ることもできます:
        %~dp1       - %1 をドライブ文字とパスだけに展開します。
        %~nx1       - %1 をファイル名と拡張子だけに展開します。
        %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                       検索して %1 を探し、最初に見つかったファイル
                       のドライブ文字とパスだけに展開します。
        %~ftza1     - %1 を DIR の出力行のように展開します。
    上の例の %1 と PATH は、他の有効な値で置き換えることができます。
    %~ 構文は有効な引数の数によって区切られます。%~ 修飾子は %* と同時には使用できません。

うーん、長いですね。少しずつ解説したいのですが、別の機会にします。callコマンドの基本形は下記の様に記述します。

call next.bat

とても簡単です。『next.bat』の部分にバッチファイルのファイル名(ファイルパス)を記述するだけです。基本的にこれだけで大丈夫です。

ちなみに、callコマンドを実行してバッチを呼び出した場合、呼び出したバッチの処理が終了した後に呼び出し元の処理を続行します。試しに、中身を以下の様に記述したバッチを作成して実行してみて下さい。

@echo off

echo before_call

call next.bat

echo after_call

pause

「next.bat」の中身はHello,worldを表示させるくらいで大丈夫です。私は以下の内容で「next.bat」作成してみました。

@echo off

echo Hello,world

そして「next.bat」を呼び出すバッチを実行した結果が以下です。

before_call
Hello,world
after_call
続行するには何かキーを押してください . . .

まず、呼び出し元でechoを実行してDOS画面上に「before_call」を表示させました。次にcallコマンドで「next.bat」を呼び出し、「next.bat」の中のコマンドを実行します。内容は「Hello,world」を表示するだけです。そして、「next.bat」の内容が終了して、呼び出し元のバッチ処理に戻って来たので、続いて「after_call」を表示させています。

startコマンド

startコマンドもDOS先生に尋ねてみましょう。コマンドプロンプトを起動して、以下を入力してEnterキーを押下します。

help start

DOS先生に尋ねてみると、とても長いお返事を頂きますので、ピックアップして説明します。まず、startコマンドの基本形は以下です。

start next.bat

callコマンドと同様に、『next.bat』の部分にバッチファイルのファイル名(ファイルパス)を記述します。callコマンドと違うのは、呼び出したバッチファイルが終了しないまま呼び出し元の処理を続行します。先ほどと同様に以下のバッチを作成します。

@echo off

echo before_call

start next.bat

echo after_call

pause

「next.bat」も同様にHello,Worldを表示させるだけの内容で作成して、startコマンドを記述したバッチを実行してみます。すると、呼び出したバッチの処理と別画面でコマンドプロンプトが出てきて、「Hello,World」だけが表示されていると思います。この理由は明確で、「help start」でDOS先生に尋ねた時に、一番最初の回答が以下の様に記述されています。

指定されたプログラムまたはコマンドを実行するためにウィンドウを開きます

DOS先生が仰るように、別ウィンドウを開いて、そちらでバッチを実行します。業務上、プロセスを別にしたい場合には有効ですが、callコマンドと同じノリでstartコマンドを使用すると、処理の順番が異なるので、注意して下さい。

バッチファイル名を指定

これはDOS先生に聞く方法が無いので、実際に試した方が理解しやすいです。以下の記述をしたバッチを作成して下さい。

@echo off

echo before_call

next.bat

echo after_call

pause

これまでと同様に、Hello,Worldを表示させるだけの「next.bat」を作成して、バッチを実行してみます。すると、一瞬でコマンドプロンプトの画面が消えますね。なので、「next.bat」の中身の最後の記述に「pause」と記述してもう一度実行してみましょう。すると、コマンドプロンプトに以下の様に表示されるはずです。

before_call
Hello,world
続行するには何かキーを押してください . . .

そしてキーを押下すると、コマンドプロンプトの画面が閉じられます。バッチファイル名を指定してバッチファイルを呼び出したとき、呼び出し元の後続処理が実行されないまま終了します。呼び出し後に何も処理を書かないのであれば問題ありませんが、実用的かどうかを考えると、業務上、使う機会が無いのではと個人的には考えます。

まとめ

今回、バッチファイルを呼び出す方法を3つ紹介させて頂きました。改めてまとめると、以下のような結果になります。

  • callコマンド ←呼び出したバッチを実行して、呼び出し元の処理を継続
  • startコマンド ←別ウィンドウでバッチが実行
  • バッチファイル名を指定 ←呼び出し先のバッチが終了するとオシマイ

callとstartは業務上で使う機会があると思います。ほとんどcallコマンドだと思いますが、世の中には色々なシステムがあるので、一概に正解があるとは言い難いです。状況に応じて使い分けて下さい。ファイル名を指定して直接呼び出す方法は多分使わないと思いますが。