在 Windows 批处理文件中使用 SET /a 时遇到 08 值问题

在 Windows 批处理文件中使用 SET /a 时遇到 08 值问题

我有一堆批处理文件,使用 set /a 来填写月、日、年等变量。

例子:

Set/a Year = %date:~10,4%
Set/a Month = %date:~4,2%
Set/a Day = %date:~7,2%

任何时候月份或日期的值为 08,表达式就会失败,但在其他日期/月份却可以正常工作,因此 08 的评估方式一定有一些特殊之处,有人能告诉我为什么吗?

例子:

C:\>Set/a Month = %date:~4,2%
Invalid number.  Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).

我最初并没有编写这些文件,但确实维护了它们,并且 SET 似乎在没有使用 /a 的情况下工作正常,因此这解决了我眼前的问题,但仍然想了解为什么 08 是一个问题,而 07、06 等不是。

答案1

八进制仅使用 0-7,8 和 9 不是其中的数字。08 是八进制文字,但却是无效的(八进制中的 8 是 011),因此是错误的。删除前导 0。

它从您的区域设置中获取这些值,所以我知道“删除 0”是有点无用的建议。它之所以可以在没有 /a 的情况下工作,是因为我认为数据类型(和类型转换):

set [<variable>=[<string>]]
set /a <variable>=<expression>

在第一个语法中,变量被设置为一个字符串,在您的情况下为“08”,通过删除前导 0(或 0),它被转换为数字(隐式,因为日期需要一个数字),所以它被解释为数字 8。

当 08 是一个表达式时,如第二种语法一样,它首先被解释为数字文字,在本例中是八进制,并且 08 是无效的。

答案2

你可以用一些数学知识来解决它。

set /a month=1%date:~4,2% - 100

在数字前加上1,所有两位数的月份都会变成一个超过一百的有效数字。
然后只需减去 100 即可。

08 -> 180
12 -> 112

相关内容