我正在制作游戏,对于set /a "var"
,var
变为0且缺少运算符。
这是一些代码
set /p confirm=y/n :
if '%confirm%' == 'y' (
set /a partner=Ignite
set /a monsterlevel=5
set /a reqexp=100
set /a currentexp=0
set /a element=Fire
set /a evolution=Igneous
set /a move1=Scratch
set /a move2=Burn
set /a move3=Flame Spread
set /a move4=Quick Slash
set /a hp=100
goto mymonster
)
if '%confirm%' == 'n' goto pick
我该如何解决这个问题?
答案 0 :(得分:0)
打开命令提示符窗口,运行set /?
并读取所有帮助页面输出到控制台窗口。
选项/A
用于算术表达式,不应该用于将字符串值赋给环境变量。环境变量总是字符串类型。
在线
set /a partner=Ignite
Windows命令处理器将Ignite
解释为环境变量的名称,将转换为整数值的字符串值分配给从整数转换回字符串的变量partner
。由于很可能没有变量Ignite
,因此将值0作为字符串分配给partner
。
在线
set /a move3=Flame Spread
Windows命令处理器将Flame
和Spread
解释为环境变量的名称。但是之间没有运算符,因此算术表达式因缺少运算符而无效。
解决方案:
@echo off
setlocal EnableDelayedExpansion
set "confirm=n"
set /P "confirm=y/n : "
if /I "!confirm!" == "y" (
set "partner=Ignite"
set "monsterlevel=5"
set "reqexp=100"
set "currentexp=0"
set "element=Fire"
set "evolution=Igneous"
set "move1=Scratch"
set "move2=Burn"
set "move3=Flame Spread"
set "move4=Quick Slash"
set "hp=100"
goto mymonster
)
if /I "!confirm!" == "n" goto pick
rem The user has entered whether y/Y nor n/N. What to do now?
如果批处理用户只是点击 RETURN 或 ENTER 而没有输入任何内容,则使用默认值定义环境变量confirm
。在这种情况下,环境变量confirm
保持其当前值,或者如果之前未定义,则仍未定义。
由于 IF 选项/I
,字符串比较不区分大小写。在命令提示符窗口if /?
中运行以获取有关此命令的帮助。
使用延迟扩展完成字符串比较。这是为了安全,因为批处理用户可能错误地或有意地输入例如"<
并且现在进行字符串比较而不使用延迟扩展,批处理将立即退出第一个 IF 条件行,因为语法错误。
在比较字符串时,始终使用双引号而不是单引号。双引号对于Windows命令处理器在评估 IF 条件时具有特殊含义,但单引号不是。字符'
被解释为与==
的字符串比较,如字母或数字,它没有特殊含义。但请注意,Windows命令处理器将==
左右两侧的字符串与双引号进行比较。因此,双引号内的字符串不会被比较,但带有双引号的字符串意味着if /I "!confirm!" == y
将永远不会成立。