我正在使用CMD命令处理一些变量。我可以在变量中加1,但如果该变量是08或09,则结果为1,而不是9或10.这里是代码:
setlocal EnableDelayedExpansion
set day=08
echo Day:%day%
set /a day+=1
echo Day:% day%
这适用于数字1-7和10之后。我需要将前导零添加到小于10的数字,因为否则变量不会写入文本文件(我稍后执行),尽管显示正确的值在代码的其他部分。
答案 0 :(得分:1)
可以通过在命令提示符窗口set /?
中运行来读取命令 SET 的帮助。它解释了前导0的数字被解释为八进制数,请参阅Windows命令解释器内部使用的 base 为0
(自动检测)的函数strtol。 p>
08
和09
在八进制数系统中无效,因此使用值0
进行解释。
这种情况的一种解决方案是在预处理状态期间首先使用字符串连接将字符串08
更改为108
并从99
中减去108
转换为整数将08
和09
以及01
增加到31
增加1
。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "day=08"
echo Day: %day%
set /A day=1%day% - 99
echo Day: %day%
endlocal
上述批处理文件的输出为:
Day: 08
Day: 9
这里不需要延迟的环境变量扩展,并且通常在算术表达式中根本不需要,也可以通过命令 SET 的帮助来解释。当然,在命令块中执行算术表达式之前,必须首先执行字符串连接之类的异常,在该命令块中,在命令块中定义或修改了环境变量。但这些用例非常罕见。
如果对于少于两位的数字,结果应该是前导0
,则最好不要减去99
,而是添加1
并分配给环境变量下一步只是字符串的最后两位数,在计算算术表达式后总是3位数。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "day=08"
echo Day: %day%
set /A day=1%day% + 1
set "day=%day:~-2%"
echo Day: %day%
endlocal
上述批处理文件的输出为:
Day: 08
Day: 09
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
set /?
setlocal /?
答案 1 :(得分:0)
Numeric values are decimal numbers, unless
prefixed by 0x for hexadecimal numbers, and 0 for octal numbers.
So 0x12 is the same as 18 is the same as 022. Please note that the octal
notation can be confusing: 08 and 09 are not valid numbers because 8 and
9 are not valid octal digits.
来自set /?
。