jebのソリューションは素晴らしいです。しかし、それはすべての状況において適切ではないかもしれません。
1)構文エラーは、すべてバッチ処理を停止します。したがって、バッチスクリプトがスクリプトを呼び出し、スクリプトが構文エラーで停止した場合、制御は呼び出し元に返されません。それは悪いかもしれない。
2)通常、バッチ処理が終了すると、すべてのSETLOCALに暗黙のENDLOCALがあります。しかし、致命的な構文エラーはバッチ処理を終了します暗黙のENDLOCALなし!これは私のDosTips詳細についてはSETLOCAL continues after batch termination!を投稿ください:-(厄介な結果をもたらす可能性がある。
アップデート2015年3月20日すぐにすべてのバッチ処理を終了するきれいな方法についてhttps://stackoverflow.com/a/25474648/1012053を参照してください。
関数内でバッチファイルを停止するもう1つの方法は、コマンドシェルを完全に終了するEXITコマンドを使用することですが、CMDを少し独創的に使用すると、問題を解決するのに役立ちます。
@echo off
if "%~1" equ "_GO_" goto :main
cmd /c ^""%~f0" _GO_ %*^"
exit /b
:main
call :label hello
call :label stop
echo Never returns
exit /b
:label
echo %1
if "%1"=="stop" exit
exit /b
私は「daveExit.bat」という名前の私のバージョンと私のPCの「jebExit.bat」という名前のジェブのバージョンの両方を持っています。
私は、このバッチスクリプト
@echo off
echo before calling %1
call %1
echo returned from %1
そして、ここを使用してそれらをテストEXITソリューションの結果
>test jebExit
before calling jebExit
hello
stop
>test daveExit
before calling daveExit
hello
stop
returned from daveExit
>
一つの潜在的な欠点は、環境への変更が保存されていないということですされています。それは部分的に終了する前に一時ファイルにenvironentを書き込み、その後にそれを読み戻すことで解決することができます。
@echo off
if "%~1" equ "_GO_" goto :main
cmd /c ^""%~f0" _GO_ %*^"
for /f "eol== delims=" %%A in (env.tmp) do set %%A
del env.tmp
exit /b
:main
call :label hello
set junk=saved
call :label stop
echo Never returns
exit /b
:label
echo %1
if "%1"=="stop" goto :saveEnvAndExit
exit /b
:saveEnvAndExit
set >env.tmp
exit
しかし、価値の改行文字(0x0Aを)持つ変数が適切に保存されません。
可能重複(http://stackoverflow.com/questions/3227796/exit-batch-script-関数内から) – Nathan