08小于1,但在DOS/Batch中07大于1.为什么?

ano*_*mal 2 comparison numbers dos batch-file

在DOS/Batch中

if 08 lss 1 echo true
Run Code Online (Sandbox Code Playgroud)

回应"真实".这同样适用于09. 08和09都小于1.

然而,

if 07 lss 1 echo true
Run Code Online (Sandbox Code Playgroud)

没有回应什么.01至07不小于1.

为什么?08和09有什么特别之处?

dbe*_*ham 5

扩展了sarnold和David Schwartz已经提供的答案......

我从未见过任何文档声明IF支持八进制或十六进制数字表示法.但是你的问题促使我做了一些测试,实际上它确实支持SET/A支持的相同数字符号.

  • 任何不以0开头的数字组[0-9]都被解释为十进制.
  • 任何前缀为0的数字[0-7]都被解释为八进制.
  • 任何以0x或0X为前缀的数字组[0-9,AF,af]都被解释为十六进制.

任何不满足上述3个数字符号中的任何一个的字符集都被视为字符串.

如果比较的两边都是有效数字,则进行数字比较.

如果任何一方不是有效数字,则进行字符串比较.

07是十进制值为7的有效八进制表示法,不小于1.

08和09的前缀为0但不是有效的八进制表示法,因此进行字符串比较.任何以0开头的字符串将排序为小于以1开头的字符串.

一些有趣的测试确认支持八进制和十六进制表示法.

if 0xA equ 10 echo ok
if 011 equ 9 echo ok
Run Code Online (Sandbox Code Playgroud)

有趣的是,SET/A语句中的无效八进制或十六进制表示法会引发错误.但IF语句中的无效八进制或十六进制表示法不会引发错误.它只是强制进行字符串比较.

更新

有效号码前面可能带有符号指示符: - 或+

if +0xA equ +10 echo ok
if -011 equ -9 echo ok
Run Code Online (Sandbox Code Playgroud)