批处理:如何从subrpgram跳转到主程序的出口?
Batch: How to Jump from subrpgram to the exit of the main program?
我有一个 control_script.cmd 可以按原样工作,但有点难以阅读。基本上,我想在第一个程序 returns 出错时退出我的脚本。
set text=converting something...
call %libdir%_convert_xlsx.cmd
set rvalue=%errorlevel%
call :check_errorlevel !rvalue! "!text!"
if !rvalue! geq 1 goto :my_error_handler
set text=loading something...
call %libdir%_load_something.cmd
set rvalue=%errorlevel%
call :check_errorlevel !rvalue! "!text!"
if !rvalue! geq 1 goto :my_error_handler
:check_errorlevel
set rvalue=%~1
set text=%~2
echo do something with rvalue and text
exit /b 0
:my_error_handler
exit /b 1
如果我可以将 if 子句移动到 check_errorlevel 部分,那就更好了,比如
call %libdir%_convert_xlsx.cmd
call :check_errorlevel %errorlevel% "converting something..."
call %libdir%_load_something.cmd
call :check_errorlevel %errorlevel% "loading something..."
:check_errorlevel
set rvalue=%~1
set text=%~2
echo do something with rvalue and text
if !rvalue! geq 1 goto :my_error_handler
exit /b 0
:my_error_handler
exit /b 1
但是我遇到的问题是 :my_error_handler 没有在 :check_errorlevel 中定义,而且我看不到任何其他方法可以直接从 :check_errorlevel 到结尾我的命令。有没有?
此致,彼得
这是我提到的宏样式的示例
@Echo off & Setlocal EnableExtensions EnableDelayedExpansion
rem // macro definition within delayed expansion environment requires exclaimation marks to be thrice escaped.
rem // outer For %%n loop uses If ()Else construct to capture the trailing string within the output variable at the time of expansion.
Set "CHKErr=For %%n in (1 2)Do If %%n==2 (If Not "^^^!Errorlevel^^^!"=="0" (Echo/Failed [^^^!Errorlevel^^^!] - ^^^!Output^^^!&Endlocal &Goto :EOF)Else (Echo/Success - ^^^!Output^^^!))Else Set Output="
Call :truelabel 2> Nul
%CHKErr%:truelabel
Call :falselabel 2> Nul
%CHKErr%:falselabel
Echo/You'll never see this on fail.
Goto :Eof
:truelabel
Exit /B 0
%所以在@aschipfl 提示后,我将使用下面的代码。我实际上仍然需要测试它,但我在这里感觉很好。
call %libdir%_convert_xlsx.cmd
call :check_errorlevel %errorlevel% "converting something..." || goto :my_error_handler
call %libdir%_load_something.cmd
call :check_errorlevel %errorlevel% "loading something..." || goto :my_error_handler
goto :all_fine
:check_errorlevel
set rvalue=%~1
set text=%~2
echo do something with rvalue and text
if %rvalue% GEQ 1 ( set my_errorlevel = 1 ) else ( set my_errorlevel = 0 )
REM notice that this errorlevel only transfers the input-errorlevel and is not an errorlevel by itself.
exit /b %my_errorlevel%
:my_error_handler
exit /b 1
:all_fine
exit /b 0
编辑:{} 到 () 感谢 stefano
我有一个 control_script.cmd 可以按原样工作,但有点难以阅读。基本上,我想在第一个程序 returns 出错时退出我的脚本。
set text=converting something...
call %libdir%_convert_xlsx.cmd
set rvalue=%errorlevel%
call :check_errorlevel !rvalue! "!text!"
if !rvalue! geq 1 goto :my_error_handler
set text=loading something...
call %libdir%_load_something.cmd
set rvalue=%errorlevel%
call :check_errorlevel !rvalue! "!text!"
if !rvalue! geq 1 goto :my_error_handler
:check_errorlevel
set rvalue=%~1
set text=%~2
echo do something with rvalue and text
exit /b 0
:my_error_handler
exit /b 1
如果我可以将 if 子句移动到 check_errorlevel 部分,那就更好了,比如
call %libdir%_convert_xlsx.cmd
call :check_errorlevel %errorlevel% "converting something..."
call %libdir%_load_something.cmd
call :check_errorlevel %errorlevel% "loading something..."
:check_errorlevel
set rvalue=%~1
set text=%~2
echo do something with rvalue and text
if !rvalue! geq 1 goto :my_error_handler
exit /b 0
:my_error_handler
exit /b 1
但是我遇到的问题是 :my_error_handler 没有在 :check_errorlevel 中定义,而且我看不到任何其他方法可以直接从 :check_errorlevel 到结尾我的命令。有没有?
此致,彼得
这是我提到的宏样式的示例
@Echo off & Setlocal EnableExtensions EnableDelayedExpansion
rem // macro definition within delayed expansion environment requires exclaimation marks to be thrice escaped.
rem // outer For %%n loop uses If ()Else construct to capture the trailing string within the output variable at the time of expansion.
Set "CHKErr=For %%n in (1 2)Do If %%n==2 (If Not "^^^!Errorlevel^^^!"=="0" (Echo/Failed [^^^!Errorlevel^^^!] - ^^^!Output^^^!&Endlocal &Goto :EOF)Else (Echo/Success - ^^^!Output^^^!))Else Set Output="
Call :truelabel 2> Nul
%CHKErr%:truelabel
Call :falselabel 2> Nul
%CHKErr%:falselabel
Echo/You'll never see this on fail.
Goto :Eof
:truelabel
Exit /B 0
%所以在@aschipfl 提示后,我将使用下面的代码。我实际上仍然需要测试它,但我在这里感觉很好。
call %libdir%_convert_xlsx.cmd
call :check_errorlevel %errorlevel% "converting something..." || goto :my_error_handler
call %libdir%_load_something.cmd
call :check_errorlevel %errorlevel% "loading something..." || goto :my_error_handler
goto :all_fine
:check_errorlevel
set rvalue=%~1
set text=%~2
echo do something with rvalue and text
if %rvalue% GEQ 1 ( set my_errorlevel = 1 ) else ( set my_errorlevel = 0 )
REM notice that this errorlevel only transfers the input-errorlevel and is not an errorlevel by itself.
exit /b %my_errorlevel%
:my_error_handler
exit /b 1
:all_fine
exit /b 0
编辑:{} 到 () 感谢 stefano