批处理错误:数字常量为十进制(17),十六进制(0x11)或八进制(021)

时间:2016-07-19 16:00:09

标签: batch-file batch-processing

我提取两个数字并为其添加一个数字。但当最后两位数字为08时,它会抛出上述错误。

set last_two=!file_name:~-2,2!
set /a add_millisec=!last_two!+1
set add_millisec=0!add_millisec!
set add_millisec=!add_millisec:~-2!

有人可以在这里检查并帮助我......

1 个答案:

答案 0 :(得分:3)

打开命令提示符窗口并键入set /?

  

[...]数字值是十进制数,除非前缀为0x(十六进制数字),0(八进制数字)。因此,0x12与18相同,与022相同。请注意,八进制表示法可能令人困惑:08和09不是有效数字,因为8和9不是有效的八进制数字。 [...]

您会发现set /A将前导0的数字视为八进制数。

要解决此问题,您可以执行以下操作:

  1. 使用1作为前缀,并在计算后再次将其删除:

    set last_two=1!file_name:~-2,2!
    set /A add_millisec=last_two+1
    set add_millisec=!add_millisec:~-2!
    

    为此,您需要提前知道总位数。

  2. 在进行任何计算之前删除尾随零,然后根据需要使用前导零填充结果:

    set last_two=!file_name:~-2,2!
    rem The following line removes all leading zeros:
    for /F "tokens=* delims=0" %%Z in ("!last_two!") do set last_two=%%Z
    set /A last_two+=0 & rem this avoids `last_two` to be empty if it is `0`
    set /A add_millisec=last_two+1
    set add_millisec=0!add_millisec!
    set add_millisec=!add_millisec:~-2!
    

    或者:

    set last_two=!file_name:~-2,2!
    rem The following two lines remove all leading zeros:
    cmd /C exit !last_two!
    set /A last_two=!ErrorLevel!
    set /A add_millisec=last_two+1
    set add_millisec=0!add_millisec!
    set add_millisec=!add_millisec:~-2!
    

    由于您不知道位数,因此此方法更灵活。