Programming Field

Call - DOS コマンド一覧

スポンサーリンク

バッチファイルの中で、新しいバッチファイルを起動する時に現在のバッチ処理を終了させずに起動させるときに使います。

構文

call <command-line>

[Windows NT 系] [拡張構文]

call :<label> [<label-param> ...]
<command-line>
実行させるバッチファイルを指定します。パラメータが必要な場合は指定することもできます。
:<label>
[Windows NT 系] [拡張構文] 同じバッチファイル内に存在するラベルを指定します。指定したラベルにジャンプした後に「Exit /B」が実行されると、処理がこのCallを呼び出した次の行に戻ります。
<label-param> ...
[Windows NT 系] [拡張構文] ラベルの後ろに引数をつけることができます。

解説

Callは、バッチファイルを実行中にそのバッチファイルを終了させずに新しいバッチファイルを実行するために用います。サンプルの記述にもあるように、Callを付けずにバッチファイルを実行した場合は実行元のバッチファイルの処理はそこで終了してしまいます。

[Windows NT 系] [拡張構文] Callの拡張構文を使うと、プログラム内の関数呼び出しのように、バッチファイル内に記述されているラベル(詳しくは「:」のページを参照)に処理を移し、「Exit /B」を使って元の処理に戻すことができます。この際、通常のバッチファイルの呼び出しと同じように引数を指定することで、「%1」や「%2」を用いてその引数にアクセスすることができます。

サンプル1

call C:\foo.bat

バッチファイル C:\foo.bat を実行します。この記述のあるバッチファイルは C:\foo.bat が終了し次第この記述以降の処理を続けます。(Callがない場合はそこで処理は終了します。)

サンプル2 [バッチファイル]

@echo off
call :exec_cmd foo.exe %1
call :exec_cmd bar.exe %1
rem バッチファイルを終了する場合、gotoで末尾に飛ぶかexit /bを使います。
goto end

:exec_cmd
echo %1 を引数 %2 で実行しますか?
choice /C YN
if %errorlevel%==2 exit /B 0
%1 %2
exit /B %errorlevel%

:end

[Windows Vista以降] [拡張構文] バッチファイルに指定された引数を使って「foo.exe」と「bar.exe」を実行します。この際、Choiceコマンドを使ってそれぞれのプログラムを実行するかどうか尋ね、Nが選択されたらそのプログラムを実行しないようにします。

なお、「Choice」を用いているためWindows XPとそれ以前では動作しません(MS-DOSのChoice.comを使う場合は構文を少し修正する必要があります)。また、バッチファイルの引数がダブルクオーテーションマーク(" ")を用いて指定されている場合は「%1」や「%2」にもダブルクオーテーションマークが含まれるため、その場合はChoiceの/Mスイッチ内に「%1」や「%2」を用いることができなくなります(/Mスイッチの引数にスペースを含む場合先頭と末尾にダブルクオーテーションマークが必要なため)。したがって、/Mスイッチの代わりにEchoを使ってメッセージを出力しています。

※ 「Exit」に「/B」を付けないと呼び出し元のバッチファイル、あるいは呼び出し元のコマンドプロンプトそのものが終了してしまうので注意してください。

サンプル3 [バッチファイル]

@echo off
setlocal
call :get_fullpath FULL_FILENAME "%FILENAME%"
myapp.exe %FULL_FILENAME%
exit /B %errorlevel%

:get_fullpath
    set "%~1=%~f2"
    exit /b 0

[Windows XP以降] [拡張構文] 環境変数「FILENAME」にセットされているファイル名から現在のディレクトリに基づいたフルパス(完全なパス名)を取得するため、「get_fullpath」というラベルを作成しています。get_fullpath では「%」の引数展開の拡張を用いて2番目の引数をフルパスに変換し、1番目の引数で指定された名前を持つ環境変数にそのフルパスをセットしています。

※ 「%」による展開の拡張では「%FILENAME%」から直接フルパスを得る方法がないため、上記では一旦「get_fullpath」を通す処理を行っています。ファイル名がバッチファイルの引数から得られるもの(%1など)である場合は直接「%~f1」などとして取得することができます。