批次无效数字错误?

时间:2015-08-30 22:26:00

标签: batch-file

这是我遇到过的最奇怪的错误。虽然我见过:

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,错误仍然会触发。

2 个答案:

答案 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

我们将得到一个丢失的操作数错误:等号是二元运算符,并且找不到左侧操作数。