web-dev-qa-db-ja.com

GOTO:EOFはどこに戻りますか?

私はコードのどこに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
28
s6398197atuser

:EOFは、Microsoftがコマンド GOTO のドキュメントで説明している事前定義ラベルです。コマンドプロンプトウィンドウgoto /?で実行することによるヘルプ出力は、End Of Fileのこの特別なラベルについても説明しています。ただし、この事前定義されたラベルは、デフォルトで有効になっているコマンド拡張でのみサポートされています。

コマンドプロンプトウィンドウcall /?で実行することによるヘルプ出力と、もちろんコマンドのドキュメント CALL は、goto :EOFを使用してcall :Labelで呼び出されたサブルーチンを終了します。

サブルーチンは、コマンドcallで呼び出される現在のバッチファイル内に埋め込まれた別のバッチファイルに他なりません。サブルーチンがバッチファイルの終わりにある場合、ファイルの実際の終わりはサブルーチンの終わりを示します。

ただし、バッチファイルには複数のサブルーチンを含めることができます。

そのため、コマンド処理で特定の行に到達してサブルーチンを終了し、呼び出し元のコマンドラインに戻るには、コマンドインタープリターにコマンドが必要です。 goto :EOFexit /Bの両方を使用して、サブルーチンを終了するか、現在のバッチファイル処理を終了することができます。

問題のバッチコードでは、firstgoto :EOFexitバッチファイルループの終了後、サブルーチンコードへの不要なフォールスルーなしの処理。

質問者のバッチコードのsecondgoto :EOFは、サブルーチンを終了するためのですそして、2行目のFORループで処理を続行します。バッチファイルの処理は終了せず、サブルーチンの処理のみが終了します。

注1:goto EOFコロンなしでは、バッチファイルに:EOFで始まる行が実際に必要です。ジャンプラベルEOFはファイルに存在する必要があります。 goto :EOFは、:EOFで始まる行が原因でバッチファイルにラベルEOFが存在する場合でも、コマンド拡張機能を有効にしてサブルーチン/バッチ処理を常に終了します。

注2:コマンド EXIT パラメーターなし/Bは、常にコマンド全体を終了します呼び出し階層に依存せず、Windowsコマンドプロセッサの起動方法に依存しないプロセス–パラメーター/K tokeepcmd.exeとして実行コマンドプロンプトウィンドウを開くとき、または/Ccloseで開くときに使用します。バッチファイルをダブルクリックしたときのようにコマンド処理が終了しました。したがって、/Bなしのexitは、バッチファイルで賢明に使用する必要があります(最適:しない)。

注3:exit /Bは、次のコードで示すように、無効になっているコマンド拡張では機能しません。

@echo off
setlocal DisableExtensions
echo Use command exit /B with command extensions disabled.
exit /B

コマンドプロンプトウィンドウ内からこのバッチファイルを実行すると、エラーメッセージが出力されます。

指定されたバッチラベルが見つかりません-EOF

つまり、追加の終了コードのないexit /Bgoto :EOFとまったく同じであるため、コマンド拡張にも依存します。 exitなし/Bは、終了コードの有無にかかわらず常に機能します。

注4:ERRORLEVELgoto :EOFの影響を受けませんが、Microsoft GOTO このトピックに関するドキュメントはミュートされています。 exit /B #は、ERRORLEVEL#に設定します 。Microsoftの文書に記載されていますexit /B #の代わりにgoto :EOFを使用して、演算子を使用するなどのサブルーチンを呼び出すコマンドラインで評価された特定の終了コードでサブルーチンを終了することもできます&&または||またはif errorlevel Xでコマンドラインを呼び出した後の次のコマンド。ただし、goto :EOFexit /BERRORLEVELの現在の値を変更しないため、特定の終了コードでバッチファイルまたはサブルーチンを明示的に終了する必要は通常ありません。

ERRORLEVEL動作の詳細については、以下を参照してください。

56
Mofi

GOTO :EOF機能的に同等exit /Bですが、どちらの形式も拡張機能が有効な場合にのみ機能します。この点のテストは非常に簡単です。

setlocal DisableExtensions
goto :EOF

以前のコードとこれを比較してください:

setlocal DisableExtensions
exit /B

これは、GOTO :EOF同じポイントに戻ることを意味します。ここで、exit /Bは戻ります。

6
Aacini

:eofは「End of file」を意味します。以下のコマンドを実行せずにスクリプトを終了させるために使用されます。

1
Micho