2015-08-30 19 views
2

这是我遇到过的最奇怪的错误。虽然我已经看到了:批次无效数字错误?

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). 

我可以”不知道为什么会发生这种情况。

注:即使当表达式为假,错误依然闪光。

+0

我不认为你发布的代码可能会产生错误,如果IF条件是错误的。该错误消息仅在执行SET/A命令时生成,如果表达式为false,则不会发生该错误消息。该语句总是被解析,但只有在条件为真时才会执行。 – dbenham

回答

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 

,我们将得到一个缺少操作数错误:在等号是二元运算符和左侧数不能被发现。