【问题标题】:Batch File - Why set variable inside Foreach break the loop?批处理文件 - 为什么在 Foreach 中设置变量会中断循环?
【发布时间】:2021-11-02 10:48:05
【问题描述】:

我有问题。这是我的代码:

set listPath=1 2  
for %%n in (%listPath%) do ( 
    setlocal enabledelayedexpansion
    IF "!ver!"=="" (
        :loop
        echo Insert Version:
        set /p "ver="
        IF "!ver!"=="" ( 
            echo Invalid!
            Timeout /T 1 /NoBreak>nul
            goto loop
        ) ELSE (
            goto Next
        )
        :Next
    )
    echo ver: !ver!
    pause > nul
)

因为它不起作用?每次我执行第一个循环然后退出 foreach 结束执行。另一方面,如果我省略了 set / p 一切正常并循环设置良好。为什么?如何在不中断循环的情况下将该用户输入放入循环中?谢谢

【问题讨论】:

  • 1.因为您在循环中使用goto。不要那样做。更改为call 和2,您的:next 标签也无效。它的第一个操作是),这被视为无效命令。 3.您的ifelse语句不平衡。从cmdif /?

标签: batch-file


【解决方案1】:

我认为你自己把事情复杂化了,让我告诉你我为什么这么说:

choice 命令将强制您仅选择其中一个选项。它不允许任何其他选择,除了列表中的内容:

@echo off
choice /c 12 /m "Select version"
echo Ver: %errorlevel%

您已经拥有 %errorlevel% 变量,您可以使用它来反映版本,但如果您真的想要,也可以将其分配给您的 ver 变量:

@echo off
choice /c 12 /m "Select version"
set "ver=%errorlevel%"
echo Ver: %ver%

除了让它这么简单之外,您当前的代码还有很多问题。

  1. 您的ifelse 语句格式不正确。从 cmd if /? 运行以查看正确的语法。
  2. 您不能在 for 循环括号内的块中使用 goto
  3. 您的标签位置无效。它在标签后看到的第一个命令是),这是一个无效命令。
  4. for 循环甚至都不需要,老实说毫无意义。

如果您仍然想使用过于复杂的版本,那么这将是一个更好的版本:

@echo off
set "listPath=1 2"
set ver=
:loop
set /p "ver=Insert Version: "
if not %ver% equ 1 if not %ver% equ 2 (
  echo Invalid!
  Timeout /T 1 /NoBreak>nul
  goto :loop
)
echo ver: %ver%
pause>nul

【讨论】:

    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多