2009-07-26 6 views
6

Sto cercando di trovare il modo di uscire/uscire dal ciclo FOR, se si è verificato un errore. Di seguito è riportato il contenuto del file batch.Esci in ciclo - Processore comandi Windows (CMD.EXE)

@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 ha più record. Se ci sono degli errori allora mi aspetto di uscire dal file batch piuttosto che controllare il file sample.txt completo. per esempio. sulla dichiarazione echo% recfile%, Se inserisco un comando errato ech% recfile% che è comando errato, mi aspetto che vada a livello fail1 ed esci. E 'convalidato il codice di errore con successo e andando a livello di fail1 tuttavia dopo questa statzione, sta controllando di nuovo il file sample.txt (record successivo). C'è un modo, se posso rompere/uscire dal ciclo FOR.

Si prega di consulenza.

Grazie,

risposta

4

È possibile impostare una variabile, il che significa che il ciclo completo deve essere interrotta e usare in questo modo:

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

E tu saresti cambiare il ciclo come questo:

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

(suddiviso in più righe per la leggibilità).

Poiché si sta chiamando una subroutine dal ciclo for, non è possibile per questa subroutine uscire direttamente dal ciclo. Da qui la soluzione con una variabile.

5

La risposta di Joey è ottima. L'ho usato con successo. Ho scoperto che non è necessario uscire dallo script. È possibile utilizzare goto :SomeLabel, dove :SomeLabel è un'etichetta esterna al ciclo.

 
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 
... 

2

Non è necessario chiamare un'etichetta

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 
+1

Qual è 'ENABLEDELAYEDEXPANSION' facendo qui ?! –