我使用的是美国英语地区的Windows 2008 R2。我的批处理文件在8月1日之后停止工作。从三月到七月,一切都很顺利。
该脚本将以零开头的数字月份转换为字符串。这是要复制的脚本。实际的批处理脚本从%date%中提取数字月份。
set month=07
REM convert numerical month to string
for /f "tokens=%month%" %%A in (
"jan feb mar apr may jun jul aug sep oct nov dec") do (
set month_str=%%A
)
echo %month_str%
以上运行良好。显示"jul"
但如果我把月份改为08,它失败了,并显示错误消息
8" was unexpected at this time
所以我去掉了前导零。
set /A month=100%month% %% 100
现在它又正常工作了,下面是我的问题
- 适用于Windows 2008 R2的FOR命令的官方文档在哪里
编辑:http://technet.microsoft.com/en-us/library/cc754900.aspx
- 将零填充数字传递给代币选项可能是我的错,但为什么07是可以接受的,而不是08
- 如果07是有效的参数,它是和7相同还是被解释为其他参数
根据对问题的评论,您似乎已经意识到Windows试图将08视为八进制,但这当然失败了。
每当CMD.EXE内部命令需要解析一个数字时,它会将任何以0
为前缀的数字字符串视为八进制,将任何以0x
为前缀的数值字符串视为十六进制。这些数字也可以有选择地加上一个符号作为前缀。数字仅限于可以表示为带符号4字节整数的值:-2147483648到2147483647。
我所知道的Microsoft文档中关于十六进制和八进制数字支持的唯一地方是SET命令的/A选项。但似乎所有被视为数字的字符串都以相同的方式处理。
这包括:
1)设置/A
set /a 010+0xA
18
2)FOR/F TOKENS和SKIP选项
for /f "tokens=010" %A in ("1 2 3 4 5 6 7 8 9 10") do @echo %A
8
3)FOR/L
for /l %N in (010 1 0xA) do @echo %N
8
9
10
3)中频数字比较
if 012==0xA echo match
match
4)使用子字符串操作的变量扩展(负数示例)
set "test=0123456789ABCDEF"
echo %test:~-0xA,-010%
67
这是我目前所能想到的,但可能还有其他的。