我正在尝试编写以下代码:
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