【问题标题】:Unable to return from infinite loop inside routine无法从例程内的无限循环返回
【发布时间】:2017-02-21 20:18:38
【问题描述】:

运行以下批处理文件时,我希望程序从 func 例程返回并显示“结束程序”消息。相反,在 for 循环中执行 pause 命令后,按一个键时程序似乎挂起。将 exit /b 替换为 goto :eof 似乎具有相同的效果。

@echo off

echo start program
call :func
echo end program
pause
exit /b

:func
echo start func
for /l %%l in () do (
  echo start loop
  pause
  exit /b
  echo end loop
)
echo end func
exit /b

预期输出:

start program
start func
start loop
Press any key to continue...
end program
Press any key to continue...

我想避免使用 goto-label 作为无限循环。使用以下循环,迭代消息只显示一次:

:test
for /l %%l in (1,1,3) do (
  echo iteration: %%l
  exit /b
)
exit /b

在例程中使用无限循环并且仍然能够返回给调用者的适当方法是什么?

【问题讨论】:

  • 我不确定我是否遵循,无限这个词是特定的,如果它是连续的,它如何返回?
  • @Compo:exit /b supposed 用于结束循环,但它似乎不适用于 /L 循环
  • 这个想法是在满足特定条件时从 for 循环内的函数调用返回。在批处理文件脚本中,您不能从其主体内影响 for 循环的条件。我还发现,在避免使用 goto-label 的同时,没有直接的方法可以摆脱无限循环。有关详细信息,请参阅以下 DosTips 主题:dostips.com/forum/viewtopic.php?f=3&t=2707
  • jeb answered this here 退出无限循环的唯一方法是同时退出 cmd 会话。
  • 问题是循环实际上完成了,即使它的主体中有exit /B 或goto,尽管在这种情况下主体不再执行;试试for /L %%I in (0,1,999999) do @(echo Body & exit /B),你会注意到批处理文件需要相当长的时间才能退出,尽管主体只执行一次,因为循环在后台迭代到末尾)...

标签: windows batch-file cmd


【解决方案1】:

在链接的 DosTips 主题的回复 #7 中,您可能会读到这样的短语:“没有办法在相同的 CMD 上下文中打破 FOR /L 循环,所以我使用了一个技巧来将循环导出到一个可以通过 EXIT 命令中断的新 CMD,然后执行返回到调用者代码"。那就是:

@echo off
if "%~1" neq "" goto %1

echo start program
cmd /C "%~F0" :func
echo end program
pause
exit /b

:func
echo start func
for /l %%l in () do (
  echo start loop
  pause
  exit
  echo end loop
)
echo end func
exit /b

您可以在The ultimate while loop DosTips 主题阅读有关这一点的进一步说明。

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多