批处理 - CALL和GOTO有什么区别?

18

我理解这两者都是指向代码标签,但它们有什么区别?

@echo off
:top
echo I love StackOverflow.com
goto :top

@echo off
:top
echo I love StackOverflow.com
call :top

提前感谢您!


5
你曾经在命令提示符中输入过 goto /? 或者 call /? 吗? - aschipfl
3个回答

29

你提供的例子并不能真正展示这两者之间的区别。

  • goto - 跳转到相应的标签。
  • call - 跳转到相应的标签,当代码执行完毕后会返回调用者。

在你的例子中,由于你的代码从未执行完成,所以它永远不会返回给调用者。

你可能唯一看到的区别是,call 版本在“返回位置列表”变得如此大,直到“填满”内存时最终会崩溃。

要了解如何正确使用 call 命令,请参考:http://ss64.com/nt/call.html


那个链接非常有用。谢谢。 - Dan

5
在你的示例中,除了call版本最终会崩溃外,几乎没有什么区别。 goto将执行转移到指定的标签;从那个点继续执行。 call也将执行转移到标签,但是当处理到达exitend-of-physical-file时,执行将转移到call指令直接后面的指令。 call还允许传递参数。对于作为call目标的子例程,它的%1...是由call提供的参数,而不是作为命令行参数提供给批处理过程的。
您可以call外部批处理程序或可执行文件,在调用程序结束时,执行将恢复到call后面的指令。goto将仅执行目标,并完全忘记在原始批处理程序中的位置。

2
CALL 命令还为 SETLOCAL / ENDLOCAL 命令建立了一个新的范围。ENDLOCAL 命令无法释放在 CALL 命令之前定义的变量。此外,从 CALL 返回时会自动执行 ENDLOCAL 命令。 - dbenham

0

使用call关键字会有一个返回值:

for /l %%i in (1,2,10) do call :process %%i
pause
Exit /b

:process
echo subroutine - %1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接