6

エラーが発生した場合、FORループを中断/終了する方法を見つけようとしています。以下はバッチファイルの内容です。

@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 ファイルをチェックするのではなく、バッチ ファイルを終了することを期待しています。たとえば、ステートメント echo %recfile% で、間違ったコマンド ech %recfile% を配置した場合、これは間違ったコマンドであり、fail1 レベルに移行して終了するはずです。エラーコードは正常に取得され、fail1 レベルになりますが、このステートメントの後、再度 sample.txt ファイル (次のレコード) をチェックしています。FORループを中断/終了できれば、方法はありますか。

ご意見をお聞かせください。

ありがとう、

4

3 に答える 3

6

ジョーイの答えは素晴らしいです。私は成功してそれを使用しました。ただし、スクリプトを終了する必要がないことがわかりました。を使用できますgoto :SomeLabel。ここ:SomeLabelで、 はループの外側のラベルです。

FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
  定義されている場合は、goto :ParseError を終了します
  呼び出し:プロセス "%%i"
)

@エコー成功: %myfile%
goto :RestOfScript

:パースエラー
@echo FAILURE: %myfile% を解析できません
@echo デフォルトを使用...

:RestOfScript
...

于 2011-02-23T04:44:23.237 に答える
5

変数を設定できます。つまり、完全なループを中止し、次のように使用する必要があります。

: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、このサブルーチンがループを直接終了する方法はありません。したがって、変数を使用した回避策。

于 2009-07-26T12:14:55.357 に答える
3

ラベルを呼び出す必要はありません

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
于 2013-08-12T15:27:45.767 に答える