设置/变量和变量变为0缺少运算符

时间:2016-09-05 11:36:53

标签: batch-file

我正在制作游戏,对于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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

打开命令提示符窗口,运行set /?并读取所有帮助页面输出到控制台窗口。

选项/A用于算术表达式,不应该用于将字符串值赋给环境变量。环境变量总是字符串类型。

在线

set /a partner=Ignite

Windows命令处理器将Ignite解释为环境变量的名称,将转换为整数值的字符串值分配给从整数转换回字符串的变量partner。由于很可能没有变量Ignite,因此将值0作为字符串分配给partner

在线

set /a move3=Flame Spread

Windows命令处理器将FlameSpread解释为环境变量的名称。但是之间没有运算符,因此算术表达式因缺少运算符而无效。

解决方案:

@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将永远不会成立。

另见How to set environment variables with spaces?

的答案