【问题标题】:DOS FOR command option tokens=07 works but not tokens=08DOS FOR 命令选项 tokens=07 有效,但 tokens=08 无效
【发布时间】:2012-08-03 19:24:01
【问题描述】:

我在美国英语语言环境中使用 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 相同或解释为其他内容?

【问题讨论】:

  • 那是我第一次猜测有 Unix 背景。因此问题(1)。
  • 嗯,宾果游戏!设置月份=010 八月返回!所以 FOR 命令理解八进制。这是一种惊喜。
  • Windows 充满了惊喜。
  • 数值解析记录在 SET 命令下。

标签: cmd dos


【解决方案1】:

根据问题的 cmets,您似乎已经意识到 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 数值比较

if 012==0xA echo match
match

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

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

目前我能想到的就这些了,可能还有其他的。

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 2018-12-03
    • 2016-02-03
    • 2022-01-23
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多