6

如果发生任何错误,我正在尝试找到中断/退出 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 文件。例如,在语句 echo %recfile% 上,如果我放置了一些错误的命令 ech %recfile% 这是不正确的命令,那么我期望它应该进入 fail1 级别并退出。它成功地捕获了错误代码并进入了 fail1 级别,但是在此声明之后,它再次检查 sample.txt 文件(下一条记录)。有什么办法,如果我可以打破/退出 FOR 循环。

请指教。

谢谢,

4

3 回答 3

6

乔伊的回答很棒。我已经成功地使用了它。我发现您不必退出脚本。您可以使用goto :SomeLabel, where:SomeLabel是循环外的标签。

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
  如果定义退出 goto :ParseError
  调用:进程“%%i”
)

@echo 成功:%myfile%
转到:RestOfScript

:解析错误
@echo FAILURE:无法解析 %myfile%
@echo 使用默认值...

:RestOfScript
...

于 2011-02-23T04:44:23.237 回答
5

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

: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循环中调用子程序,因此该子程序无法直接退出循环。因此,使用变量的解决方法。

于 2009-07-26T12:14:55.357 回答
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
于 2013-08-12T15:27:45.767 回答