windows - 无法从例程内的无限循环返回

标签 windows batch-file cmd

当运行以下批处理文件时,我希望程序从 func 例程返回并显示“结束程序”消息。相反,在 for 循环中执行暂停命令后按下某个键时程序似乎挂起。将 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

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

最佳答案

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

@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 主题。

关于windows - 无法从例程内的无限循环返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42377151/

相关文章:

python - 使用 ctrl + c 防止诅咒

batch-file - 创建具有多个选项的批处理文件

python - 从 PowerShell 语法错误运行 Python 脚本

batch-file - 对于 7z zip 的文件,仅最后修改的文件

windows - 如何在 Windows 命令行上使用单个命令创建多个文件?

windows - 如何仅在 Windows 命令提示符中存在父目录时才删除文件?

Windows 批处理文件 - 嵌套 FOR 循环中的变量

windows - 如何将重定向符号(< 和 >)传递给 Windows 批处理文件函数?

java - 如何在 Java 中解开 Windows 文件名?

c++ - VC++2008中存在图像控件