Windows 批处理脚本 - 对于 /L 不起作用 - 简单



需要一些快速的帮助。这是一个大学程序,一切都运行良好,除了当我调用我的 :forLoop 方法来迭代 100 个数字 (1,1,100) 从 1 开始,从 1 到 100 并进行迭代 % 5 (i%%5)。由于某种原因,我无法让它工作。感谢任何帮助或指导。

当我回显 %%A 时,它正在遍历所有完美的数字。当我回显 %result% 时,我得到一个空白的"(里面什么都没有)

:forLoop
FOR /L %%A IN (1,1,100) DO (
set /A result=%%A %% 2
echo "%%A"
echo "%result%"
)

正确的代码是

:forLoop
setlocal ENABLEDELAYEDEXPANSION
FOR /L %%A IN (1,1,100) DO (
set /A result=%%A %% 5
echo !result! >> results.txt
set /A total=!total!+!result!
echo !total!
)

问题是在读取for时替换了%result%,这意味着在执行循环时它不再是变量。您需要的是启用延迟变量扩展,然后使用 ! 而不是 %

setlocal ENABLEDELAYEDEXPANSION
:forLoop
FOR /L %%A IN (1,1,100) DO (
set /A result=%%A %% 5
echo "%%A"
echo !result!
)

这在您运行SET /?时收到的帮助消息中都有说明:

延迟环境变量扩展有助于四处走动当前扩展的限制,当一条线发生的文本被读取,而不是在执行时读取。 以下示例演示了即时变量扩展的问题:    设置VAR=之前    如果 "%VAR%" == "之前" (        设置 VAR=之后        如果 "%VAR%" == "之后" @echo 如果你看到这个,它有效    )永远不会显示该消息,因为两个 IF 语句中的 %VAR%在读取第一个 IF 语句时替换,因为它在逻辑上包括 IF 的正文,这是一个复合语句。 所以复合语句中的 IF 实际上是将"之前"与"之后"永远不会相等。 同样,以下示例将无法按预期工作:    设置列表=    对于 (*) 中的 %i 设置列表=%LIST% %i    回显 %列表%因为它不会在当前目录中建立文件列表,而是将 LIST 变量设置为找到的最后一个文件。同样,这是因为 %LIST% 仅在以下情况下扩展一次读取 FOR 语句,此时 LIST 变量为空。因此,我们正在执行的实际 FOR 循环是:    对于 (*) 中的 %i,请设置 LIST= %i它只是将 LIST 设置为找到的最后一个文件。延迟环境变量扩展允许您使用不同的字符(感叹号)以扩展环境变量执行时间。 如果启用了延迟变量扩展,则上述示例可以编写如下,以便按预期工作:    设置VAR=之前    如果 "%VAR%" == "之前" (        设置 VAR=之后        如果"!VAR!" == "之后" @echo 如果你看到这个,它有效    )    设置列表=    对于 (*) 中的 %i,请设置 LIST=!列表!%i    回显 %列表%

最新更新