batch-file - 在 DOS/Batch 中 08 小于 1,但 07 大于 1。为什么?

标签 batch-file numbers comparison dos

在 DOS/批处理中,

if 08 lss 1 echo true

回应“真”。 09也是一样,08和09都小于1。

但是,

if 07 lss 1 echo true

不回显任何东西。 01到07不小于1。

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

最佳答案

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

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

  • 任何不以 0 开头的数字集 [0-9] 都被解释为十进制。
  • 任何以 0 为前缀的数字集 [0-7] 都被解释为八进制。
  • 任何以 0x 或 0X 为前缀的数字集 [0-9,A-F,a-f] 都被解释为十六进制。

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

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

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

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

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

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

if 0xA equ 10 echo ok
if 011 equ 9 echo ok

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

更新

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

if +0xA equ +10 echo ok
if -011 equ -9 echo ok

关于batch-file - 在 DOS/Batch 中 08 小于 1,但 07 大于 1。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10628700/

相关文章:

windows - 遍历子目录中的文件夹并合并文本文件

r - 如何提取特定关键字前后的所有数字?

.net - 比较两个集合是否相等,无论其中项目的顺序如何

linux - 在 linux 中,如何仅按文件名比较两个目录并获取不匹配的结果列表

windows - 如何在 Windows 上从命令行启动 MingW 控制台 (GitBash)?

windows - 如何获取windows批处理的父文件夹

c++ - 将任何 Unicode 字符串转换为 int

java - 按位运算 OR on (double) 在 Java 中不可能,在 JavaScript 中可能

新 String ("a") 对象的 JavaScript(严格)相等

batch-file - 在批处理文件中自动单引号转义