蝙蝠文件字符串比较意外工作



为什么在Windows 7命令窗口中进行字符串比较

if "-e" geq "d" echo yes

回声yes? 似乎忽略了左侧字符串参数中任意数量的前导连字符。

我的潜在需求是一个答案,提供一种可靠的方法来按字典顺序比较两个字符串的幅度。

讨论文档

(不是答案,但评论无法完成任务)

@ECHO OFF
SETLOCAL
FOR %%a IN (
"e d TRUE"
"d e FALSE"
"-e d FALSE"
"-d e FALSE"
"e -d TRUE"
"d -e TRUE"
"-e -d TRUE"
"-d -e FALSE"
"qe qd TRUE"
"qd qe FALSE"
"q-e qd FALSE"
"q-d qe FALSE"
"qe q-d TRUE"
"qd q-e TRUE"
"q-e q-d TRUE"
"q-d q-e FALSE"
"aaa-bbb aaabbb FALSE"
"7-2 72 FALSE"
"72 7-2 TRUE"
) DO CALL :strcmp %%~a&CALL :strcmp2 %%~a
GOTO :EOF
:strcmp2
SET "p1=%1"
SET "p2=%2"
CALL :strcmp %p1:-=% %p2:-=% 
GOTO :eof
:strcmp
IF "%1" geq "%2" (ECHO %1 geq %2 TRUE  expected %3) ELSE (ECHO %1 geq %2 FALSE expected %3)
GOTO :eof

上面的演示表明,OP的观察似乎非常有效。

for中的字符串提供给两个子例程;第一个子例程执行与预期结果的比较,第二个子例程使用相同的参数,但删除了所有-,并且没有关于预期结果的注释。

(原文如此)反对(已处理)的结果是一致的,表明-似乎被忽略了 - 不仅当它首先出现时,只有一个明显的例外

例外是最后一个示例。"72"格克?"7-2"返回"false",其中"true"是合乎逻辑的。如果比较是严格按字母顺序进行的,则2大于-因此"真实"。如果忽略-,则7272相同,因此"true"。即使进行了计算72 geq 5,结果也将是"真实的"。

那么这是怎么回事呢?-不是简单地奇怪地分配了一个>z整理值,否则-e会被>d

我想知道是否忽略了-,但72是一个比7-2短的字符串,这就是为什么这种比较返回"false"的原因。

我相信,这需要更多的关注。怪癖书的另一个条目...

最新更新