Uscita nel ciclo For – Windows Command Processor (CMD.EXE)

Sto cercando di trovare il modo di entrare /uscire dal ciclo FOR, se c’è qualche errore.
Di seguito è il contenuto del file batch.

@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ù di un record. Se non ci sono errori si è verificato, quindi mi aspetto di chiudere il file batch piuttosto quindi il controllo completo sample.txt file. ad esempio, su istruzione
echo %recfile%, Se ho posto alcune comando sbagliato ech %recfile% che non è corretto comando quindi mi aspetto che dovrebbe andare a fail1 livello e di uscita. È catured il codice di errore con successo e andare a fail1 livello tuttavia dopo questa istruzione, si verifica il sample.txt file (record successivo). C’è un modo, Se posso rompere /uscita loop.

Si prega di consulenza.

Grazie,

OriginaleL’autore | 2009-07-26

3 risposte

  1. 6

    Joey risposta è grande. L’ho usato con successo. Ho scoperto che non è necessario uscire dallo script. È possibile utilizzare goto :SomeLabel, dove :SomeLabel è un’etichetta al di fuori del ciclo.

    FOR /F "tokens=1,2 delims=," %%i in (%myfile%) ( 
    se definito uscita goto :ParseError 
    chiamata :processo "%" 
    ) 
    
    @echo SUCCESSO: %myfile% 
    goto :RestOfScript 
    
    :ParseError 
    @echo ERRORE: impossibile analizzare %myfile% 
    @echo Utilizza di default... 
    
    :RestOfScript 
    ... 
    
    

    OriginaleL’autore Shane Poznikoff

  2. 5

    È possibile impostare una variabile, il che significa che il ciclo completo deve essere interrotta e di utilizzarlo come questo:

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

    E ti piacerebbe cambiare il loop come questo:

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

    (spezzato in più righe per migliorare la leggibilità).

    Visto che hai appena chiamata di un sottoprogramma dal for loop non c’è modo di questa subroutine per uscire dal loop direttamente. Quindi la soluzione con una variabile.

    OriginaleL’autore Joey

  3. 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
    
    Che cosa è ENABLEDELAYEDEXPANSION facendo qui?!

    OriginaleL’autore SSi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *