DOS FOR命令选项内标识=07有效,但内标识=08无效



我使用的是美国英语地区的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

现在它又正常工作了,下面是我的问题

  1. 适用于Windows 2008 R2的FOR命令的官方文档在哪里

编辑:http://technet.microsoft.com/en-us/library/cc754900.aspx

  1. 将零填充数字传递给代币选项可能是我的错,但为什么07是可以接受的,而不是08
  2. 如果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

这是我目前所能想到的,但可能还有其他的。

最新更新