バッチファイルから実行体(exe)を実行→結果を取得→結果をもとに処理
ということをするバッチファイルについてです!
制約はあるものの、コレによってバッチファイルでできることの幅は広がりますね!
概要
やることはこんな感じ。
- mainで値を返すexeを作成する
- バッチファイルで、ERRORLEVEL変数を使用する
試す
まずはこんな感じのソースで試してみます。
C言語ソース
結果となる値をセットして、表示→returnするだけの簡単なプログラムです。
#include <stdio.h> int main(void) { int ret = 1; printf("ret=%d\n", ret); return ret; }
コレをビルドし、「main.exe」を作りましょう。
gccだろうとVisual Studioだろうと、なんでもOKです。
バッチファイル
作ったmain.exeを実行して、結果を表示します。
@echo off main.exe echo %ERRORLEVEL%
「%ERRORLEVEL%」とすることで、戻り値を取得することができます。
結果
このように表示されます。
ret=1 1
exeで行っているprintfの出力と、ERRORLEVELで取得した戻り値が表示されましたね!
exeの結果をバッチで使用する
例えばexeの結果に応じて分岐する処理を作成します。
@echo off main.exe rem 戻り値が1ならOK、違うならNG if %ERRORLEVEL% equ 1 ( echo OK! ) else ( echo NG )
先程のexeのまま実行すると
ret=1 OK!
と出力されますね!
ソースの戻り値を適当な値に変更して実行すると……
ret=5 NG
ちゃんとNGになりましたね!
文字列を返すと……?
戻り値を文字列に変更してコンパイルし直します。
char* main(void) { return "文字列だよ"; }
バッチを実行すると……
16994304
謎の値になりました。
実数を返すと……?
戻り値をdoubleに変更してコンパイルし直します。
double main(void) { return 2.58; }
バッチを実行……
8943856
コチラも謎の値になりました。
戻り値は整数値を!
そもそもERRORLEVELってなんなの?というと
Windowsバッチファイルの「errorlevel」は特別な変数です。この変数には、直前で実行したバッチファイルやコマンドがどのような状態で終了したかという情報(「終了コード」と呼ぶ)が格納されています。正常に終了したのか、異常終了であったかという情報です。
引用: https://jj-blues.com/cms/command-errorlevel/
要するに、終了コードを取得する為の変数なわけですね。
よくあるプログラムの戻り値とは異なり、終了コードはエラーコードを指します。
例えば、
- 0: OK
- 1: ファイル読込エラー
- 2: 値不正エラー
みたいな感じで作ったりします。
なので文字列とか実数とかは、用途から外れる為、「なんらかの値」となっているのかと思います。
(とはいえなんの値なのか……)
設定されるのは「最後の値」
ERRORLEVELに設定されるのは、「最後に実行したexeの結果」です。
なので新しく「sub.exe」というものを用意したとします。
// sub.exeのソース #include <stdio.h> int main(void) { int ret = 9; printf("sub ret=%d\n", ret); return ret; }
更にバッチファイルで、このsub.exeをmain.exeのあとに実行してみます。
@echo off main.exe sub.exe echo %ERRORLEVEL%
すると結果は
ret=5 sub ret=9 9
となります。
戻り値がvoidのものは?
戻り値がvoidの場合、ERRORLEVELには「0」が設定されます。
また「最後に実行した結果」となるので、前例のように「main→sub」と読んだとします。
このときsubの戻り値がvoidだとしても、mainの結果は消え、ERRORLEVELの値は0で上書きされます。
subをこのように変更します。
// sub.exeのソース void main(void) { printf("sub: No return\n"); // 戻り値なし }
コレを先程のバッチファイル
@echo off main.exe sub.exe echo %ERRORLEVEL%
で実行すると、結果は
ret=5 sub: No return 0
となります。
あとがき
簡単なプログラムとバッチファイルを作って、連携させたい!なんてときに使えますね!
このexeの実行結果で分岐して、次にする処理が変わる……
という例に挙げたようなものが作れるだけでも、作れるものの幅が広がりますね!