2015-08-30 18 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 

,我們將得到一個缺少操作數錯誤:在等號是二元運算符和左側數不能被發現。