退出批处理文件的最佳实践?

ljk*_*ljk 13 windows scripting batch-file

对于批处理文件,我想检查不同的条件并提供帮助消息

显示消息后退出批处理文件的最佳做法是哪一种?

if "%1"=="/?"(
  echo "help message"
  exit /b 0
)
[more code]
Run Code Online (Sandbox Code Playgroud)

或者

if "%1"=="/?"(
  echo "help message"
  goto :EOF
)
[more code]
:EOF
Run Code Online (Sandbox Code Playgroud)

第一个对我未经训练的眼睛来说似乎更好,但网上的很多例子都使用GOTO标签方法

SO 社区对此有何看法?

Unk*_*pus 21

我个人使用exit.

  • 普通exit命令只是终止当前脚本和父脚本(例如,如果您从命令行运行脚本,或从另一个批处理文件调用它)

  • exit /b 用于终止当前脚本,但让父窗口/脚本/调用标签保持打开状态。

  • 通过退出,您还可以添加退出的错误级别。例如,exit /b 1将产生%errorlevel%1。 示例:

@echo off
call :getError     rem Calling the :getError label
echo Errorlevel: %errorlevel%     rem Echoing the errorlevel returned by :getError
 pause

:getError
exit /b 1    rem exiting the call and setting the %errorlevel% to 1 
Run Code Online (Sandbox Code Playgroud)

会打印:

Errorlevel: 1
press any key to continue...
Run Code Online (Sandbox Code Playgroud)

在创建可能会失败的批处理脚本时,使用此方法设置错误级别非常有用。您可以:labels为不同的错误分别创建,并让每个错误都返回一个唯一的错误级别。

  • goto :eof结束当前脚本(调用)而不是父文件,(类似于exit /b)
  • 与 exit 不同,exit 可以设置退出错误级别,goto :eof自动将错误级别设置为当前设置的级别,从而更难以识别问题。

两者也可以在同一个批处理文件中统一使用:

@echo off
call :getError
echo %errorlevel%
pause
goto :eof

:getError 
exit /b 2
Run Code Online (Sandbox Code Playgroud)

退出批处理脚本的另一种方法是使用cmd /kWhen 在独立批处理文件中使用,cmd /k将使您返回到常规命令提示符。

总而言之,我建议使用exit只是因为您可以设置错误级别,但是,这真的取决于您。


dbe*_*ham 6

GOTO :EOF 与 EXIT /B 之间没有功能或性能差异,只是 EXIT /B 允许您指定返回的 ERRORLEVEL,而 GOTO :EOF 则不允许。

显然,如果您想在返回时指定 ERRORLEVEL,那么 EXIT /B 是首选。

如果您不关心返回代码,或者您知道 ERRORLEVEL 已设置为正确的值,那么这没有什么区别 - 这完全是一个偏好/编码风格的问题。