批处理文件中的多行 IF 语句内的变量值未递增 [重复]

Posted

技术标签:

【中文标题】批处理文件中的多行 IF 语句内的变量值未递增 [重复]【英文标题】:variable value not incremented inside multiline IF statement in batch file [duplicate] 【发布时间】:2021-07-05 23:25:26 【问题描述】: 我在 Windows 7 中使用命令提示符。 我发现这很奇怪,在 if 子句中修改的变量值只有在 if 子句完全执行后才会更新。 这是一个简单的例子来说明这一点。
@echo off
set /a somevar=0
set match_string="match"
:loop
echo at loop beginning - somevar is %somevar%
if %match_string% equ "match" (
set /a somevar+=1
echo somevar inside if statement after increment - %somevar%
)
echo somevar after if statement is %somevar%
pause
goto loop

如何在 if 语句中更新 somevar?

谢谢。

【问题讨论】:

对这个问题的否决 - 你能把 que 分数设为零吗,因为我试图解释我的问题并编写了一个示例代码来验证。我可以删除这个问题,但回答过的专家会不知所措。而且,它可以帮助将来的人。谢谢。 【参考方案1】:

你正在为缺少delayedexpansion而苦恼

@echo off
Setlocal EnableDelayedExpansion
set somevar=0
set "match_string=match"
:loop
echo before loop: %somevar%
if "%match_string%" == "match" (
     set /a somevar+=1
     echo inside loop: !somevar!
)
echo after loop: %somevar%
pause>nul
goto loop

注意循环中的!somevar! 而不是%somevar%

您可以通过从cmd 运行set /?setlocal /? 来阅读更多信息

然而,我没有投票关闭作为重复项的原因也是为了突出您不正确的if 语句和setting 变量。请参阅我在答案中所做的更改。

我认为在这种特殊情况下,您不需要带括号的块,因此也不需要 delayedexpansion

@echo off
set somevar=0
set "match_string=match"
:loop
echo before loop: %somevar%
if "%match_string%" == "match" set /a somevar+=1
echo after if statement: %somevar%
pause>nul
goto loop

【讨论】:

我的问题旨在更新 if 语句中的变量,并在相同的 if 语句中使用更新后的值。所以我发布了一个示例,其中 if 有多个要执行的语句。 delayexpansion 看起来对此很有用。但是我认为您在写“您不需要带括号的块,因此不需要延迟扩展”时误解了 是的。我完全按照要求回答了你的问题。第二部分只是一个仅供参考。使用它,不要使用它。 好的。谢谢 。顺便说一句,我尝试了一件对我的案子有用的东西。如果要使用更新的值,我在多行之前添加了 'if "%match_string%" == "match" set /a somevar+=1'。 那么现在你有 2 个if 语句?对于同样的情况?那是不是有点低效?你有很多选项要实现,所以如果你不喜欢使用delayedexpansion,那么在操作块中使用call,然后你可以添加任意数量的选项,而不必使用delayedexpansion 我将使用延迟扩展。出于好奇,您能否提供替代“调用”方法的链接?

以上是关于批处理文件中的多行 IF 语句内的变量值未递增 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

jsp页面如何获js中if语句的变量值

使用 C# 中的方法更改另一个范围内的变量值

检查内联函数内的变量值

如何用c#中的变量值替换字符串?

在 C++ 中的 glutIdleFunc() 中变量值未递增

P1597 语句解析