2009-07-26 7 views
6

Ich versuche zu finden, die FOR-Schleife zu brechen/beenden, wenn ein Fehler aufgetreten ist. Unten ist Inhalt der Batch-Datei.Exit in For-Schleife - Windows-Befehlsprozessor (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 hat mehrere Datensätze. Wenn ein Fehler aufgetreten ist, erwarte ich, die Batch-Datei zu verlassen, anstatt die komplette sample.txt-Datei zu überprüfen. z.B. on-Anweisung echo% recfile%, Wenn ich einen falschen Befehl ech% recfile% was falsch Befehl ist, dann erwarte ich, dass es auf fail1 level gehen und beenden sollte. Es ist der Fehlercode erfolgreich und geht auf fail1 level, aber nach dieser Anweisung wird die Datei sample.txt (next record) erneut überprüft. Gibt es irgendeinen Weg, wenn ich die FOR-Schleife brechen/verlassen kann.

Bitte um Rat.

Danke,

Antwort

4

Sie eine Variable gesetzt, was bedeutet, dass die komplette Schleife abgebrochen und es wie folgt verwenden sollte:

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

Und würden Sie die Schleife wie folgt ändern:

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

(zur besseren Lesbarkeit in mehrere Zeilen unterteilt).

Da Sie gerade ein Unterprogramm aus der for-Schleife aufrufen, gibt es für dieses Unterprogramm keine Möglichkeit, die Schleife direkt zu verlassen. Daher die Problemumgehung mit einer Variablen.

5

Joey's Antwort ist großartig. Ich habe es mit Erfolg benutzt. Ich habe festgestellt, dass Sie das Skript nicht beenden müssen. Sie können goto :SomeLabel verwenden, wobei :SomeLabel ein Label außerhalb der Schleife ist.

 
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

Sie brauchen kein Etikett

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

Was 'ENABLEDELAYEDEXPANSION' hier tun, ist zu nennen ?! –