这是我遇到过的最奇怪的错误。虽然我见过:
Invalid number. Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).
错误一百万次,我无法理解这段代码有什么问题:
if "%ss%" == "00" (
set /a 3n%1+=%3
set /a 3n%1+=%4
)
这给出了:
C:\Users\...>if "00" == "00" (
set /a 3n2+=1
set /a 3n2+=3
)
Invalid number. Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).
我无法弄清楚为什么会这样。
注意:即使表达式为false,错误仍然会触发。
答案 0 :(得分:3)
错误来自于您的变量名称3n2
以数字开头。
虽然变量名称在技术上有效,但starting it with a number is a really bad idea and you should never do it。
要避免错误,请将变量名称的第一个字符更改为字母或下划线。
if "%ss%" == "00" (
set /a _3n%1+=%3
set /a _3n%1+=%4
)
答案 1 :(得分:2)
我同意SomethingDark的answer:起始数字导致"错误" 行为,它可以(必须!)解决,改变变量的名称。
通用批处理解析器标识set
命令,调用看到/A
开关的内部函数asociated,并将所有工作委托给处理算术语法的其他解析器。
行为的来源是set /a
算术解析器允许的语法。虽然显而易见set /a 3n2+=1
正在向变量添加一个,但set /?
帮助说明了
set /a expression
=
是运营商也就是说,虽然set /a
可以并且通常习惯于设置变量的值,但它允许set /a 1+1
,而不涉及任何变量。变量只是赋值运算符使用的一个操作数。
当算术解析器开始工作时,第一个操作之一(在引用删除,初始空间修剪,......之后)检查输入行中要处理的下一个字符是否为数字,如果是,解析器假定已找到数字操作数,并且需要从输入命令文本到数字的转换才能操作,此处生成错误,因为3n2
无法转换为数字。
当然,如果文本可以转换为数字而且没有转换错误,
set /a 123=1
我们也会找到并错误,一个缺少运算符。等号左侧部分的数据已被识别为数字,并且数字不能作为赋值运算符的左侧(需要变量),解析器需要一个不能找到的不同运算符。
类似(更明显)的情况是
set /a =123+1
我们将得到一个丢失的操作数错误:等号是二元运算符,并且找不到左侧操作数。