0

我在美国英语语言环境中使用 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%

以上运行良好。它显示“七月”

但是,如果我将月份更改为 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 相同或解释为其他内容?
4

1 回答 1

1

根据对问题的评论,您似乎已经意识到 Windows 正试图将 08 视为八进制,这当然失败了。

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

我知道微软文档讨论十六进制和八进制数字支持的唯一地方是 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) 为 /L

for /l %N in (010 1 0xA) do @echo %N
8
9
10

3) IF数值比较

if 012==0xA echo match
match

4)使用子串操作的变量扩展(负数示例)

set "test=0123456789ABCDEF"
echo %test:~-0xA,-010%
67

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

于 2012-08-03T21:22:51.317 回答