プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、バッチファイル(.bat)を終了するときは「exit」ではなく「exit /B」を使おう
結論から書くと

exit

は、そこで全部の処理をブチッ!と止めて終了します。
仮に他のバッチファイルから呼び出されていた場合、親バッチファイル毎終了してしまうのです。

一方、

exit /B 【戻り値】

は、終了するのは自分だけです。
他のバッチファイルから呼び出されていた場合、親バッチファイルに処理が戻ります。

「exit /B」の方が直感的に期待している動作に近くないですか?
実際にはケース・バイ・ケースで使い分けるべきですが、
慣れるまでは「exit /B」を使うように意識しておいた方が良いと思います。

それでは、詳細を書いていきます。

お客さま先の新人君が作ったバッチファイルを見せていただいたところ、
こんな処理を書いていましたφ(--)

■hoge.bat
@echo off

echo あーだこーだの処理

exit 0

「echo あーだこーだの処理」の部分は、本題に関係無いので私が置き換えています。
実際には「新人君、成長したなぁ(ノ∀`)」と涙がちょちょぎれるくらい、
なんかいろいろやっていました。

新人君は満ち足りた顔をしております。
きっと、自分の仕事を自画自賛しているのでしょう。

ゴメンね(ノ∀`)

実はこのバッチファイル、他のバッチファイルから呼ばれるのが前提のバッチファイルなのです。
だから

exit 0

は、あまりよろしくない。

例えば、こんな親バッチファイルがあったとしましょうφ(--)

■parent_hoge.bat
@echo off

call hoge.bat
echo %ERRORLEVEL%

pause

実はこれ、ERRORLEVELが表示される前に、バッチファイルが終了してしまいます。
「exit」はそこで全部の処理をブチッ!と止めてしまうので、
「hoge.bat」の「exit 0」が呼ばれた時点で「parent_hoge.bat」も終了してしまうのです。

これはちょっと……恐らく、期待している動作とは違いますよね?
そんな切ない状況を変えるためには

exit 0



exit /B 0

に変更してあげる必要があります。
「/B」オプションを付けるのです。

ちなみに「/B」オプションが何かですが、ヘルプには

CMD.EXE ではなく、現在のバッチ スクリプトを終了するように指定します。バッチ スクリプトの外から実行された場合、CMD.EXE を終了させます。

と書いてありました。
「現在のバッチ スクリプトを終了するように指定」するためのオプションですね。

というわけで、これをφ(--)

■parent_hoge.bat
@echo off

call hoge.bat
echo %ERRORLEVEL%

pause

■hoge.bat
@echo off

echo あーだこーだの処理

exit 0

こうするとφ(--)

■parent_hoge.bat
@echo off

call hoge.bat
echo %ERRORLEVEL%

pause

■hoge.bat
@echo off

echo あーだこーだの処理

REM exit 0
exit /B 0

ERRORLEVELが親バッチに返却されて、画面に表示されるようになります。

やったねっヾ(´∀`)ノ

さて、ここで一旦立ち止まって考えてみましょう。

exit 0

と書いた部分はバグなのでしょうか?

いいえ、実はバグと決めつけることはできません。
何故なら、こうすれば「exit 0」のままでも問題無く動くからですφ(--)

■parent_hoge.bat
@echo off

REM call hoge.bat
cmd /C hoge.bat
echo %ERRORLEVEL%

pause

■hoge.bat
@echo off

echo あーだこーだの処理

exit 0

子バッチファイルを「call」ではなく「cmd /C」で呼び出せば問題無く動きます。
だから、新人君が頑なな心を持っていた場合は、

先輩の作った親バッチからの呼び出し方が悪いんすよー。ぶーぶー。

と主張するでしょう。
このクソガキがっ!(#゚д゚)って感じですね。

冗談はさておき「exit 0」で処理を終了しても、呼出元で調整すれば動きます。

でも、普通はわざわざ「cmd /C」なんて書き方しないですよね?
子バッチファイルを呼び出すときは「call」や「start」を使う方が一般的です。

これが「exit」ではなく「exit /B」を使おうと言う理由です。
バグではないかもしれませんが、バグになりやすそうな処理も排除しましょう。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事