bat文件字符串比较意外停止工作
为什么,在Windows 7的命令窗口,做字符串比较bat文件字符串比较意外停止工作
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
中的字符串被提供给两个子例程;第一个用预期的结果执行比较,第二个用相同的参数执行比较,但所有的-
都被删除,对预期的结果没有任何评论。
为(SIC)对结果(处理)是一致的,表明-
似乎被忽略 - 而不是仅当它出现第一与一个明显的例外
例外情况是最后一个例子。 “72”geq? “7-2”在“真”是合乎逻辑的情况下返回“假”。如果比较严格按字母顺序排列,那么2
大于-
,因此为“真”。如果-
被忽略,那么72
和72
是相同的,因此是“真”。即使计算72 geq 5
已经完成,结果也是“真实的”。
那么有什么交易? -
并不简单地被指定为>z
整理值,或者-e
将>d
。
我不知道-
是否被忽略,但72
是一个比7-2
更短的字符串,这就是为什么这个比较返回“false”。
我相信这需要更多的眼睛。另一个怪癖书的条目...
根据'if /?',“如果string1和 string2都是由所有数字组成,那么这些字符串将被 转换为数字并执行数字比较。”算术运算符可能被认为是数字(尽管它们不是)? – SomethingDark
@SomethingDark:很有可能 - 非初始位置的'-'可以说是'15',所以'7-2'将是7 * 100 + 15 * 10 + 2,因此大于'72' – Magoo
Aren'字符串比较也忽略了t空格吗?我认为空格和连字符(以及其他一些字符?)被认为是一种单词分隔符,它们在比较和排序时被忽略... – aschipfl
你不能做一个字符串的算术比较! – RGuggisberg
我认为双引号会使它成为词典对比。我的理解是“if”比较运算符理解并将比较字符串,因为这两个参数都用双引号引起来。事实上,我发现要按预期工作,除了我所问的这个连字符。 –