批处理文件。if 语句中的 if 语句

批处理文件。if 语句中的 if 语句

我正在尝试编写以下代码:

If %dropmode%==on (
If %drop% LEQ %potiondrop% (
set /a potion=%potion%+1
)
If %drop2% LEQ %potiondrop% (
set /a potion=%potion%+1
)
)

因此,条件“if %drop2% LEQ %potiondrop%”不起作用,但条件“if %drop% LEQ %potiondrop%”起作用。该怎么办?

答案1

问题在于 Windows 命令提示符/命令行解释器 (CLI),即 CMD.EXE,有一个错误(好吧,我相信微软认为这是一个功能),当它读取一个块结构IF … ( … )或一个FOR循环时,它会解释所有变量%variable_name%立即地,在执行循环或块之前。在您的示例中,potion当您进入块时 if 为 0 If %dropmode%==on ( … ),则%potion%该块内的所有出现的 都计算为 0,因此您的两个set语句都被视为set /a potion=0+1,即使您potion在块内进行更改。这从您报告的屏幕输出中可以看出。

解决方法是告诉 CMD 在执行引用变量的语句时允许变量在正确的时间扩展。您可以通过添加

setlocal enabledelayedexpansion

在批处理文件开头附近的某个地方,将计数代码更改为如下形式

    set /a potion=!potion!+1

使用表格激活延迟扩展。请参阅和了解更多信息。!variable_name!SET /?SETLOCAL /?


%PS 另一个解决方案就是简单地从语句中删除字符set并说

set /a potion=potion+1

相关内容