退出for循环 - Windows命令处理器(CMD.EXE)(Exit in For loop

2019-06-26 20:28发布

我想找到办法摆脱FOR循环/退出,如果有任何错误发生。 下面是批处理文件的内容。

@echo on

set myfile=D:\sample.txt

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do call :process "%%i"

:process
set recfile=%1%

echo %recfile%
echo "Step in Test1"
echo %errorlevel%
pause;

exit /B 0
If %errorlevel% NEQ 0 goto :fail1

:fail1
echo "Step in fail1"
pause;
exit /B 9993

:EOF

Sample.txt的具有多个记录。 如果有任何错误,则发生我期待着退出批处理文件而不是检查完整sample.txt的文件。 例如,在声明回声%recfile%,如果我把一些错误的命令ECH%recfile%,这是不正确的命令,然后我期待它应该去FAIL1水平和退出。 它的成功catured的错误代码,并要FAIL1级然而这statment后,它的检查sample.txt的文件(下一个记录)一次。 有什么办法,如果我能打破/退出for循环。

请指教。

谢谢,

Answer 1:

乔伊的答案是伟大的。 我已经成功使用过它。 我发现,你不必虽然退出脚本。 您可以使用goto :SomeLabel ,其中:SomeLabel是环外的标签。

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
  if defined exit goto :ParseError
  call :process "%%i"
)

@echo SUCCESS: %myfile%
goto :RestOfScript

:ParseError
@echo FAILURE: cannot parse %myfile%
@echo Using defaults...

:RestOfScript
...



Answer 2:

你可以设置一个变量,这意味着完整的循环应该被中止,并使用它像这样:

:fail1
echo "Step in fail1"
pause
set exit=1

你会改变这样的循环:

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
  if defined exit (
    exit /b 9993
  ) else (
    call :process "%%i"
  )
)

(分成多个线,用于阅读)。

既然你只是调用从子程序for循环有没有办法让这个子程序直接退出循环。 因此具有可变的解决方法。



Answer 3:

你并不需要调用一个标签

set USBDRIVE=SETLOCAL 
set exit=ENABLEDELAYEDEXPANSION

FOR %%D IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (
  DIR %%D:\SOURCES\INSTALL.WIM > nul 2>&1 && call set USBDRIVE=%%D: && call set exit=1
  if defined exit goto :dd3
)
:dd3


文章来源: Exit in For loop - Windows Command Processor (CMD.EXE)