我在美国英语语言环境中使用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
现在它再次正常运行,这是我的问题
编辑:http://technet.microsoft.com/en-us/library/cc754900.aspx
答案 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
这就是我现在所能想到的,但可能还有其他人。