【问题标题】:Batch error: Numeric constants are either decimal (17), hexadecimal (0x11), or octal (021)批处理错误:数字常量是十进制 (17)、十六进制 (0x11) 或八进制 (021)
【发布时间】:2016-07-19 16:00:09
【问题描述】:

我正在提取两位数并添加一位。但是当最后两位数字是 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!

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

【问题讨论】:

  • 以 0 开头的常量是八进制值,但 8 和 9 不是有效的八进制数字,因此出现错误
  • 是的,因为 8 和 9 不是八进制数字,所以我遇到了这个错误。有什么办法可以避免这种情况并继续我的流程
  • 你可以在另一个问题中找到几种方法。最简单的方法是在开头添加 1,然后减去 100
  • 谢谢你,它成功了。我在它前面附加了 1

标签: batch-file batch-processing


【解决方案1】:

打开命令提示符窗口并输入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!
    

    这种方法更灵活,因为您不知道位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 2014-03-11
    • 1970-01-01
    • 2016-09-04
    • 2013-10-22
    • 2012-12-12
    • 2019-04-29
    相关资源
    最近更新 更多