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

Batch - What is the difference between CALL and GOTO?

我理解 link 和代码中的标签,但有什么区别?

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

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

提前致谢!

您给出的示例并不能真正显示出两者之间的区别。

  • goto - 转到标签。
  • call - 转到标签,然后在代码完成后 returns 给调用者。

在您的示例中,由于您的代码永远不会完成,因此它永远不会 return 发送给调用者。

您可能会看到的唯一区别是,当“where to return to”列表变得如此之大直到“填满”内存时,call 版本最终会崩溃.

看call指令如何正确使用:http://ss64.com/nt/call.html

call有一个return:

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

:process
echo subroutine - %1

在你的例子中,很少 - 除了 call 版本最终会崩溃。

goto 将执行转移到指定的标签;执行从该点继续。

call也将执行转移到标签但是当处理到exitend-of-physical-file时,执行被转移回call 指令之后的指令。

call也允许传递参数。至于作为 [=10= 目标的子例程],它的 %1... 是由 call 提供的参数,而不是作为命令行参数提供给批处理过程。

您可以 call 外部批处理或可执行文件,并且在 那个 调用的例程结束时,执行将恢复 call 之后的指令. goto 将简单地执行目标,而完全忘记它在原始批处理中的位置