Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Windows 如果内部循环使用批处理脚本失败,如何从外部循环退出_Windows_Batch File_Cmd - Fatal编程技术网

Windows 如果内部循环使用批处理脚本失败,如何从外部循环退出

Windows 如果内部循环使用批处理脚本失败,如何从外部循环退出,windows,batch-file,cmd,Windows,Batch File,Cmd,如果内部循环使用批处理命令出现任何问题,有人能帮助我终止整个主程序吗 下面是我的代码。 这里,若在内环中找到的值是X,我需要退出主外环 但目前我的代码只能从内部循环中退出 For %%A in (alpha beta gamma) DO ( Echo Outer loop %%A Call :inner ) Goto :eof :inner For %%B in (U V W X Y Z) DO ( if %%B==X ( exit /b 2 ) Echo In

如果内部循环使用批处理命令出现任何问题,有人能帮助我终止整个主程序吗

下面是我的代码。

这里,若在内环中找到的值是X,我需要退出主外环

但目前我的代码只能从内部循环中退出

For %%A in (alpha beta gamma) DO (
   Echo Outer loop %%A
   Call :inner 
)
Goto :eof

:inner
For %%B in (U V W X Y Z) DO (
   if %%B==X ( exit /b 2 )
   Echo    Inner loop    Outer=%%A Inner=%%B

)
exit /b 1
输出:仅应如下所示

Outer loop alpha
   Inner loop    Outer=alpha Inner=U
   Inner loop    Outer=alpha Inner=V
   Inner loop    Outer=alpha Inner=W

您已经设置了退出代码(errorlevel)。只要对它作出反应:

setlocal enabledelayedexpansion
For %%A in (alpha beta gamma) DO (
   Echo Outer loop %%A
   Call :inner 
   if !errorlevel! equ 2 (echo inner loop failed & exit /b 2)
)
Goto :eof

:inner
For %%B in (U V W X Y Z) DO (
   if %%B==X ( exit /b 2 )
   Echo    Inner loop    Outer=%%A Inner=%%B

)
exit /b 1

Aschipfl建议“只要在
调用
命令行之后插入
if ErrorLevel 2 goto:EOF


这可能是一个好主意(并避免延迟扩展),但请注意,
if errorlevel 2
实际上意味着“if errorlevel为2或更高”。如果您的内部循环只返回
0
2
,那肯定是更好的解决方案。当它可能返回更多可能的错误级别时,您必须使用
if errorlevel
极其小心地处理它们。(这就是原因,我选择了
if!errorlevel!
而不是)

只要在
调用
命令行之后插入
if errorlevel 2 goto:EOF
…谢谢Stephen,我有一个疑问,假设我有多个内部函数,那么我需要为每个内部循环维护errorlevel吗?例如,Call:inner1 Call:inner2 Call:inner3如果任何一个错误级别失败,如何使用单个错误级别限制执行?我不太明白。你想在一个内部循环失败后立即中断外部循环,还是想执行所有内部循环而不管它们是否成功,然后才知道其中一个是否失败?如果有多个内部循环,并且任何一个内部循环失败,我必须中断外部循环。只要重复两行
调用…
如果…
用于每个内部循环。(必要时,您可以将
退出
更改为
转到:错误
;当然,还可以在某个位置添加标签
:错误
,以在出现任何“内环错误”时执行操作)(顺便说一句:任何
goto
都将中断所有循环。因此
如果%%B==X goto:ExitLoops
在内部循环中,将取消所有当前运行的循环,并跳转到标签
ExitLoops
(而不是返回到外部循环)