Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理:如何从子程序跳到主程序的出口?_Batch File_Goto - Fatal编程技术网

Batch file 批处理:如何从子程序跳到主程序的出口?

Batch file 批处理:如何从子程序跳到主程序的出口?,batch-file,goto,Batch File,Goto,我有一个control_script.cmd,它可以正常工作,但有点难读。基本上,我想在第一个程序返回错误时退出脚本 set text=converting something... call %libdir%\1_convert_xlsx.cmd set rvalue=%errorlevel% call :check_errorlevel !rvalue! "!text!" if !rvalue! geq 1 goto :my_error_handler set tex

我有一个control_script.cmd,它可以正常工作,但有点难读。基本上,我想在第一个程序返回错误时退出脚本

set text=converting something...
call %libdir%\1_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%\2_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%\1_convert_xlsx.cmd 
call :check_errorlevel %errorlevel% "converting something..."

call %libdir%\2_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
但这里我面临的问题是:我的错误处理程序没有在:check\u errorlevel中定义,我看不到任何其他方法可以直接从:check\u errorlevel到cmd的末尾。有吗


致以最诚挚的问候,Peter这里是我提到的宏风格的一个例子

@Echo off&Setlocal EnableExtensions EnableDelayedExpansion
rem//延迟扩展环境中的宏定义要求感叹号三次转义。
rem//outer For%%n循环使用If()Else构造在扩展时捕获输出变量中的尾随字符串。
设置“CHKErr=For%%n in(12)Do If%%n==2(If Not”^^^^!Errorlevel^^^^!=“0”(Echo/Failed[^^^^^^^^!Errorlevel^^^^!]-^^^^!Output^^^^和Endlocal&Goto:EOF)Else(Echo/Success^^^!Output^^^!)Else设置Output=”
调用:truelabel 2>Nul
%CHKErr%:truelabel
调用:falselabel 2>Nul
%CHKErr%:错误标签
Echo/你永远不会看到这个失败。
后藤:Eof
:truelabel
退出/b0

%因此在@aschipfl提示之后,我将选择下面的代码。事实上,我仍然需要测试它,但我在这里有一个很好的感觉

call %libdir%\1_convert_xlsx.cmd 
call :check_errorlevel %errorlevel% "converting something..." || goto :my_error_handler

call %libdir%\2_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

编辑:{}to(),感谢stefano

是否有任何理由不使用
If not errorlevel 0(command)
而不是资源密集型调用函数鉴于您已经在使用延迟扩展,可以很容易地将其编写为宏,以捕获errorlevel,执行测试并通过修改子字符串输出与正在测试的命令相关的字符串。宏方法避免将另一个环境堆栈添加到命令处理器。您不能在脚本末尾退出/b的原因是,当您使用call时,被调用的标签作为独立的子环境执行,该子环境在执行后将控件返回到父环境。@T3RR0R:子环境;是的,但是什么是旁路?原因:实际上,check_errorlevel包含一个if-else语句树。我只是简略地说了一下代码。旁路不是使用必须首先将控制权返回脚本的子例程。你可以做一个艰难的退出,但是我认为这不是你想要的。对,也许我只是尝试一下你的宏风格。
如果%rvalue%GEQ 1{set my_errorlevel=1}否则{set my_errorlevel=0}
肯定不起作用。如果%r值%GEQ 1(设置my_errorlevel=1)或其他(设置my_errorlevel=0),则应为