DOS FOR命令选项令牌= 07有效但令牌= 08

时间:2012-08-03 19:24:01

标签: cmd dos

我在美国英语语言环境中使用Windows 2008 R2。我的批处理文件在8月1日后停止工作。从3月到7月,工作正常。

该脚本将前导零的数字月份转换为字符串。这是重现的脚本。实际的批处理脚本从%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命令的官方文档在哪里?
  2. 编辑:http://technet.microsoft.com/en-us/library/cc754900.aspx

    1. 将零填充号码传递给令牌选项可能是我的错,但为什么07可以接受而不是08?
    2. 如果07是有效参数,是与7相同还是解释为其他参数?

1 个答案:

答案 0 :(得分:1)

基于对该问题的评论,您似乎已经意识到Windows正在尝试将08视为八进制,这当然会失败。

每当CMD.EXE内部命令需要解析一个数字时,它会将前缀为0的任何数字字符串视为八进制,并将任何前缀为0x的数字字符串视为十六进制。数字也可以选择带有符号前缀。数字仅限于可以表示为带符号的4字节整数的值:-2147483648到2147483647。

我知道Microsoft文档谈论十六进制和八进制数字支持的唯一地方是使用SET命令的/ A选项。但似乎所有被视为数字的字符串都以相同的方式处理。

这包括:

1)SET / 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

这就是我现在所能想到的,但可能还有其他人。