2017-10-16 62 views
0

为什么,在Windows 7的命令窗口,做字符串比较bat文件字符串比较意外停止工作

if "-e" geq "d" echo yes 

呼应yes?看起来左字符串参数中的任何数字的连字符都被忽略。

我的基本需求是一个答案,提供了一个可靠的方式来按字母顺序比较两个字符串的大小。

+0

你不能做一个字符串的算术比较! – RGuggisberg

+0

我认为双引号会使它成为词典对比。我的理解是“if”比较运算符理解并将比较字符串,因为这两个参数都用双引号引起来。事实上,我发现要按预期工作,除了我所问的这个连字符。 –

回答

0

讨论文件

(不是一个答案,但评论不能完成这项任务)

@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中的字符串被提供给两个子例程;第一个用预期的结果执行比较,第二个用相同的参数执行比较,但所有的-都被删除,对预期的结果没有任何评论。

为(SIC)对结果(处理)是一致的,表明-似乎被忽略 - 而不是仅当它出现第一与一个明显的例外

例外情况是最后一个例子。 “72”geq? “7-2”在“真”是合乎逻辑的情况下返回“假”。如果比较严格按字母顺序排列,那么2大于-,因此为“真”。如果-被忽略,那么7272是相同的,因此是“真”。即使计算72 geq 5已经完成,结果也是“真实的”。

那么有什么交易? -并不简单地被指定为>z整理值,或者-e将>d

我不知道-是否被忽略,但72是一个比7-2更短的字符串,这就是为什么这个比较返回“false”。

我相信这需要更多的眼睛。另一个怪癖书的条目...

+0

根据'if /?',“如果string1和 string2都是由所有数字组成,那么这些字符串将被 转换为数字并执行数字比较。”算术运算符可能被认为是数字(尽管它们不是)? – SomethingDark

+0

@SomethingDark:很有可能 - 非初始位置的'-'可以说是'15',所以'7-2'将是7 * 100 + 15 * 10 + 2,因此大于'72' – Magoo

+0

Aren'字符串比较也忽略了t空格吗?我认为空格和连字符(以及其他一些字符?)被认为是一种单词分隔符,它们在比较和排序时被忽略... – aschipfl