2009-07-26 23 views
6

エラーが発生した場合、FORループを中断/終了する方法を見つけようとしています。 以下はバッチファイルの内容です。Forループで終了 - 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には複数のレコードがあります。エラーが発生した場合は、完全なsample.txtファイルをチェックするのではなく、バッチファイルを終了することを期待しています。例えばon文 echo%recfile%、間違ったコマンドを間違ったコマンドech%recfile%に置くと、fail1レベルになって終了するはずです。それはエラーコードを正常に成熟させて、このステートメントの後にfail1レベルになりますが、もう一度sample.txtファイル(次のレコード)をチェックしています。私はループを終了することができます/ループを終了する方法はありますか?

アドバイスをしてください。

おかげで、

答えて

4

あなたは完全なループが中止されなければならないことを意味し、変数を設定し、このようにそれを使用することができます:

: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ループからサブルーチンを呼び出しているだけなので、このサブルーチンがループを直接終了する方法はありません。したがって、変数の回避策。

5

ジョーイの答えは素晴らしいです。私は成功にそれを使用しました。私はあなたがスクリプトを終了する必要はないことを発見した。 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 
... 

2

あなたは `ENABLEDELAYEDEXPANSION`がここでやっているラベル

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

を呼び出す必要はありません! –

関連する問題