Batch file 为什么批处理文件中的IF条件解释3大于2*2?

Batch file 为什么批处理文件中的IF条件解释3大于2*2?,batch-file,if-statement,Batch File,If Statement,我正在尝试为我正在制作的一个小型个人游戏制作一个无限水平系统,但它不起作用。这就是它看起来的样子 if %exp% gtr %lvl%*%lvl% goto lvlup :lvlup set /a exp=%exp%-%lvl%*%lvl% set /a cmhealth=%cmhealth%+5 set /a cchealth=%cchealth%+5 set /a cattack=%cattack%+3 set /a cDefence=%cDefence%+4 set /a cspeed=%

我正在尝试为我正在制作的一个小型个人游戏制作一个无限水平系统,但它不起作用。这就是它看起来的样子

if %exp% gtr %lvl%*%lvl% goto lvlup
:lvlup
set /a exp=%exp%-%lvl%*%lvl%
set /a cmhealth=%cmhealth%+5
set /a cchealth=%cchealth%+5
set /a cattack=%cattack%+3
set /a cDefence=%cDefence%+4
set /a cspeed=%cspeed%+2
set /a lvl=%lvl%+1
set /a SP=%SP%+1
goto decisions
它运行良好,直到达到以下程度:

if 3 GTR 2*2 goto lvlup
set /a exp=3-2*2
set /a cmhealth=25+5
set /a cchealth=18+5
set /a cattack=8+3
set /a cDefence=15+4
set /a cspeed=8+2
set /a lvl=2+1
set /a SP=1+1
goto decisions
然后将
exp
设置为
-1

它为什么会这样做?我如何修复它


问题是它没有将2*2读取为4或3*3读取为9。

IF命令比较主字符串

如果两个字符串都可以在内部成功转换为32位有符号整数,并且命令扩展默认启用,并用作比较运算符
eq
,或
NEQ
,或
LSS
,或
LEQ
,或
GTR
,则也比较整数,或
GEQ

但是如果不使用参数
/A
计算像commandSET这样的表达式

在命令提示窗口中运行
if/?
以获取有关此命令的帮助

由于字符串中的
*
无法将字符串
2*2
转换为整数,因此命令IF运行字符串比较,以评估左字符串是否大于右字符串

字符串比较是通过逐字节比较两个字符串的字节来完成的,直到到达两个字符串之一的任一端,或者两个字符串当前比较的字节不相等

两个字符串的字节十进制值为:

  • 3
    。。。五十一
  • 2*2
    。。。50 42 50
51大于50,因此字符串
3
大于字符串
2*2
,批处理执行继续跳转到label
lvlup

因此,有必要首先使用
set/A
对表达式
%lvl%*%lvl%
求值,然后将结果分配给一个环境变量,以便接下来将结果与另一个同样包含整数的环境变量进行比较

set /A result=lvl * lvl
if %exp% GTR %result% goto lvlup

:lvlup
set /A exp-=result
set /A cmhealth+=5
set /A cchealth+=5
set /A cattack+=3
set /A cDefence+=4
set /A cspeed+=2
set /A lvl+=1
set /A SP+=1
goto decisions

通过在命令提示窗口中运行命令SET输出
SET/?
说明,
SET/a
之后的表达式中的变量名通常不能也不应该使用
%VariableName%
(立即展开)或
引用!易变名字(延迟扩展)。绝对不是整数或算术表达式中的运算符的空格分隔字符串将自动解释为变量名,当前字符串值应在内部转换为32位有符号整数,以计算算术表达式。

您不能在
if
语句中进行算术运算,您只能比较单个值,因此必须通过
set/a
语句提前计算
%lvl%*%lvl%
,并使用其结果进行比较;如果在
if
语句中有
2*2
,它将作为一个字符串进行比较…谢谢@aschipfl它起作用了。