2016-05-29 33 views
13

我想知道在代码中的确切位置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 

回答

25

:EOF是微软在命令GOTO的文档中解释的预定义标签。通过在命令提示符窗口goto /?中运行的帮助输出还解释了此特殊标签文件结尾。但是这个预定义的标签仅在命令扩展被默认启用的情况下才被支持。

通过在命令提示符窗口call /?,当然也为命令CALL文档同时解释说goto :EOF应该用来退出调用子程序call :Label运行输出的帮助。

子程序不过是另一个嵌入在当前批处理文件中的批处理文件,它使用命令call调用。如果子程序在批处理文件的末尾,则文件的实际结束标记子程序的结束。

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

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

在所讨论的第一goto :EOF批次代码通过的子程序代码完成循环之后需要出口批处理文件处理而不不必要的下降。

提问的分批第二goto :EOF代码为离开子程序并继续在处理在第二线回路。它不会退出批处理文件的处理,它只会退出子例程。

注1:goto EOF没有冒号,需要有一个真正的线路开始在批处理文件:EOF,即跳转标签EOF必须在文件中存在。 goto :EOF总是会导致在启用命令扩展的情况下退出子例程/批处理,即使批处理文件中存在标签EOF,因为该行起始于:EOF

注2:命令EXIT不带参数/B结果总是在退出整个命令处理独立于调用层次结构,并独立于命令interpeter是如何开始参数/K保持打开,打开一个命令提示符窗口时使用)或与/C关闭在命令处理完成后双击批处理文件时使用)。因此exit没有/B应该在批处理文件中明智地使用(最好:从不)。

注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:ERRORLEVEL不受goto :EOF,但微软GOTO文件是关于这一主题的静音。 exit /B #ERRORLEVEL#as documented由微软。但是,通常不需要显式退出具有特定退出代码的批处理文件,因为goto :EOFexit /B都不修改当前值ERRORLEVEL

有关ERRORLEVEL行为的详细信息,请参阅:

+0

非常感谢! – s6398197atuser

+1

输入'cmd /?'时出现的帮助文本列出了所有受命令扩展影响的命令,但'exit'不是*提到的;感谢您指出了这一点! – aschipfl

0

:EOF指 “结束文件的”。它用于在不执行以下任何命令的情况下完成脚本。

+0

的感谢!但是循环如何发生呢?第二GOTO也说:eof不是假设说GOTO:例如? – s6398197atuser

+3

@ s6398197用户'call'产生一个子线程并且当前线程的执行暂停,直到'call'完成。 'call:subroutine'运行直到它自己的'exit/b'或EOF到达,此时在调用者处继续执行。留下回声,你可以看命令的执行顺序,希望它会更有意义。 [see this page](http://ss64.com/nt/call.html)获取更多关于'call'的信息,并且[this page](http://www.dostips.com/DtTutoFunctions.php)批处理脚本函数教程。 – rojo

+0

@Micho,非常感谢,我想我明白了! – s6398197atuser

5

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

setlocal DisableExtensions 
goto :EOF 

比较以前的代码与这一个:

setlocal DisableExtensions 
exit /B 

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