GOTO:EOF返回哪里?

s63*_*ser 29 for-loop batch-file

我试图了解代码中的确切位置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
Run Code Online (Sandbox Code Playgroud)

Mof*_*ofi 57

:EOF是Microsoft在命令GOTO的文档中解释的预定义标签.通过在命令提示符窗口中运行来帮助输出goto /?也解释了End of File的这个特殊标签.但是,只有默认情况下启用了命令扩展,才支持此预定义标签.

通过在命令提示符窗口中运行帮助输出call /?,当然还有命令CALL的文档解释了goto :EOF应该用于退出调用的子例程call :Label.

子例程只是嵌入在使用命令调用的当前批处理文件中的另一个批处理文件call.如果子例程位于批处理文件的末尾,则文件的实际结束标记子例程的结束.

但是批处理文件中可以有多个子例程.

因此,命令解释器需要一个命令来在命令处理中到达特定行时退出子例程并返回到调用命令行.goto :EOF以及exit /B可以在任何地方使用以退出子例程或退出当前批处理文件处理.

在所讨论批次码的第一 goto :EOF是需要退出批处理文件通过对子程序代码完成循环之后没有不期望的下降的处理.

提问者的批处理代码中的第二个 goto :EOF用于退出子例程并在第二行中的FOR循环中继续处理.它不会退出批处理文件的处理,它只退出子程序的处理.

注1: goto EOF没有一个冒号,需要有真正开始用线:EOF在批处理文件,即跳转标签EOF必须在文件中存在.goto :EOF即使EOF批处理文件中有标签因为以行开头,也总是导致退出子程序/批处理并启用命令扩展:EOF.

注2:命令EXIT不带参数/B的结果总是在退出整个指挥过程独立于调用层次结构,并独立于Windows命令处理器的启动方式-用参数/K保持 cmd.exe打开命令提示符窗口时运行的使用或与/C关闭命令处理完成后,用于双击批处理文件.因此exit,/B不应在批处理文件中明智地使用(最好:从不).

注3: exit /B禁用命令扩展时不起作用,如此代码所示:

@echo off
setlocal DisableExtensions
echo Use command exit /B with command extensions disabled.
exit /B
Run Code Online (Sandbox Code Playgroud)

从命令提示符窗口中执行此批处理文件会导致输出错误消息:

系统找不到指定的批次标签 - EOF

换句话说,exit /B没有额外的退出代码就是完全相同的goto :EOF,因此也依赖于命令扩展.exit没有/B或没有退出代码总是工作.

注意4: ERRORLEVEL不受影响goto :EOF,但Microsoft GOTO文档对此主题是静音的.exit /B #ERRORLEVEL# 作为记录由微软.exit /B #也可以使用,而不是goto :EOF与所述命令行调用等上使用运营商的子程序上评估一个特定的退出代码退出子程序&&||调用命令行与后下一个命令或if errorlevel X.然而,明确地离开一个批处理文件或子例程与特定的退出代码通常不需要作为既不goto :EOF也不exit /B修改的当前值ERRORLEVEL.

有关ERRORLEVEL行为的详情,请参阅:


Aac*_*ini 6

GOTO :EOF功能上等同exit /B,但两种形式仅在启用扩展时有效.这一点的测试非常简单:

setlocal DisableExtensions
goto :EOF
Run Code Online (Sandbox Code Playgroud)

比较以前的代码与此代码:

setlocal DisableExtensions
exit /B
Run Code Online (Sandbox Code Playgroud)

这意味着,GOTO :EOF返回到相同点,其中exit /B将返回.