jeb's solution works great。但在任何情況下都可能不合適。它有2個潛在的缺點:
1)語法錯誤將停止所有批處理。所以如果一個批處理腳本調用你的腳本,並且你的腳本被語法錯誤暫停,那麼控制權不會返回給調用者。這可能是不好的。
2)通常,當批處理終止時,每個SETLOCAL都有一個隱式ENDLOCAL。但致命的語法錯誤終止批處理沒有隱含的ENDLOCAL!這個可以有:-(見我DosTips發佈SETLOCAL continues after batch termination!更多信息,討厭的後果。
更新2015年3月20日一個乾淨的方式立即終止所有批處理見https://stackoverflow.com/a/25474648/1012053。
另一種在函數中暫停批處理文件的方法是使用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」和傑布的版本命名爲「jebExit.bat」我的電腦上。
然後我用這個批處理腳本
@echo off
echo before calling %1
call %1
echo returned from %1
測試他們和這裏的結果的退出方案的
>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