Выход из цикла For — командный процессор Windows (CMD.EXE)

Я пытаюсь найти способ прервать/выйти из цикла 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.

Пожалуйста посоветуй.

Спасибо,


person Community    schedule 26.07.2009    source источник


Ответы (3)


Ответ Джоуи великолепен. Я использовал его с успехом. Я обнаружил, что вам не нужно выходить из сценария. Вы можете использовать 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
...

person Shane Poznikoff    schedule 23.02.2011

Вы можете установить переменную, означающую, что весь цикл должен быть прерван, и использовать ее следующим образом:

: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, у этой подпрограммы нет возможности выйти из цикла напрямую. Отсюда обходной путь с переменной.

person Joey    schedule 26.07.2009

Вам не нужно вызывать лейбл

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
person SSi    schedule 12.08.2013
comment
Что здесь делает ENABLEDELAYEDEXPANSION?! - person Michel de Ruiter; 28.01.2016