2009-07-26 14 views
6

J'essaie de trouver un moyen de rompre/quitter la boucle FOR, s'il y a une erreur. Ci-dessous le contenu du fichier batch.Quitter dans la boucle For - Windows Command Processor (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 

Le fichier Sample.txt contient plusieurs enregistrements. S'il y a une erreur, alors je m'attends à quitter le fichier batch plutôt que de vérifier le fichier sample.txt complet. par exemple. sur l'instruction echo% recfile%, Si je place une mauvaise commande ech% recfile% qui est une commande incorrecte alors je m'attends à ce qu'elle passe au niveau fail1 et sorte. Il a réussi le code d'erreur et est passé au niveau fail1, mais après cette déclaration, il vérifie à nouveau le fichier sample.txt (enregistrement suivant). Y at-il un moyen, Si je peux casser/quitter la boucle FOR.

Veuillez nous consulter.

Merci,

Répondre

4

Vous pouvez définir une variable, ce qui signifie que la boucle complète doit être abandonnée et l'utiliser comme ceci:

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

Et vous changer la boucle comme ceci:

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

(divisé en plusieurs lignes pour plus de lisibilité).

Puisque vous appelez simplement un sous-programme de la boucle for, il n'y a aucun moyen pour que ce sous-programme quitte directement la boucle. D'où la solution de contournement avec une variable.

5

La réponse de Joey est géniale. Je l'ai utilisé avec succès. J'ai découvert que vous n'avez pas besoin de quitter le script. Vous pouvez utiliser goto :SomeLabel, où :SomeLabel est une étiquette en dehors de la boucle.

 
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

Vous n'avez pas besoin d'appeler une étiquette

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

Qu'est-ce 'ENABLEDELAYEDEXPANSION' faire ici ?! –