私はコードのどこにGOTO :EOF
が正確に戻るかを理解しようとしていますか?
コードは次のとおりです。
SET count=1
FOR /f "tokens=*" %%G IN (somefile.txt) DO (call :subroutine "%%G")
GOTO :EOF
:subroutine
echo %count%:%1
set /a count+=1
GOTO :EOF
:EOF
は、Microsoftがコマンド GOTO のドキュメントで説明している事前定義ラベルです。コマンドプロンプトウィンドウgoto /?
で実行することによるヘルプ出力は、End Of Fileのこの特別なラベルについても説明しています。ただし、この事前定義されたラベルは、デフォルトで有効になっているコマンド拡張でのみサポートされています。
コマンドプロンプトウィンドウcall /?
で実行することによるヘルプ出力と、もちろんコマンドのドキュメント CALL は、goto :EOF
を使用してcall :Label
で呼び出されたサブルーチンを終了します。
サブルーチンは、コマンドcall
で呼び出される現在のバッチファイル内に埋め込まれた別のバッチファイルに他なりません。サブルーチンがバッチファイルの終わりにある場合、ファイルの実際の終わりはサブルーチンの終わりを示します。
ただし、バッチファイルには複数のサブルーチンを含めることができます。
そのため、コマンド処理で特定の行に到達してサブルーチンを終了し、呼び出し元のコマンドラインに戻るには、コマンドインタープリターにコマンドが必要です。 goto :EOF
とexit /B
の両方を使用して、サブルーチンを終了するか、現在のバッチファイル処理を終了することができます。
問題のバッチコードでは、firstgoto :EOF
はexitバッチファイルループの終了後、サブルーチンコードへの不要なフォールスルーなしの処理。
質問者のバッチコードのsecondgoto :EOF
は、サブルーチンを終了するためのですそして、2行目のFORループで処理を続行します。バッチファイルの処理は終了せず、サブルーチンの処理のみが終了します。
注1:goto EOF
コロンなしでは、バッチファイルに:EOF
で始まる行が実際に必要です。ジャンプラベルEOF
はファイルに存在する必要があります。 goto :EOF
は、:EOF
で始まる行が原因でバッチファイルにラベルEOF
が存在する場合でも、コマンド拡張機能を有効にしてサブルーチン/バッチ処理を常に終了します。
注2:コマンド EXIT パラメーターなし/B
は、常にコマンド全体を終了します呼び出し階層に依存せず、Windowsコマンドプロセッサの起動方法に依存しないプロセス–パラメーター/K
tokeepcmd.exe
として実行コマンドプロンプトウィンドウを開くとき、または/C
をcloseで開くときに使用します。バッチファイルをダブルクリックしたときのようにコマンド処理が終了しました。したがって、/B
なしのexit
は、バッチファイルで賢明に使用する必要があります(最適:しない)。
注3:exit /B
は、次のコードで示すように、無効になっているコマンド拡張では機能しません。
@echo off
setlocal DisableExtensions
echo Use command exit /B with command extensions disabled.
exit /B
コマンドプロンプトウィンドウ内からこのバッチファイルを実行すると、エラーメッセージが出力されます。
指定されたバッチラベルが見つかりません-EOF
つまり、追加の終了コードのないexit /B
はgoto :EOF
とまったく同じであるため、コマンド拡張にも依存します。 exit
なし/B
は、終了コードの有無にかかわらず常に機能します。
注4:ERRORLEVEL
はgoto :EOF
の影響を受けませんが、Microsoft GOTO このトピックに関するドキュメントはミュートされています。 exit /B #
は、ERRORLEVEL
を#
に設定します 。Microsoftの文書に記載されています 。 exit /B #
の代わりにgoto :EOF
を使用して、演算子を使用するなどのサブルーチンを呼び出すコマンドラインで評価された特定の終了コードでサブルーチンを終了することもできます&&
または||
またはif errorlevel X
でコマンドラインを呼び出した後の次のコマンド。ただし、goto :EOF
もexit /B
もERRORLEVEL
の現在の値を変更しないため、特定の終了コードでバッチファイルまたはサブルーチンを明示的に終了する必要は通常ありません。
ERRORLEVEL
動作の詳細については、以下を参照してください。
GOTO :EOF
は機能的に同等とexit /B
ですが、どちらの形式も拡張機能が有効な場合にのみ機能します。この点のテストは非常に簡単です。
setlocal DisableExtensions
goto :EOF
以前のコードとこれを比較してください:
setlocal DisableExtensions
exit /B
これは、GOTO :EOF
が同じポイントに戻ることを意味します。ここで、exit /B
は戻ります。
:eofは「End of file」を意味します。以下のコマンドを実行せずにスクリプトを終了させるために使用されます。