爲什麼,在Windows 7的命令窗口,做字符串比較bat文件字符串比較意外停止工作
if "-e" geq "d" echo yes
呼應yes
?看起來左字符串參數中的任何數字的連字符都被忽略。
我的基本需求是一個答案,提供了一個可靠的方式來按字母順序比較兩個字符串的大小。
爲什麼,在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」比較運算符理解並將比較字符串,因爲這兩個參數都用雙引號引起來。事實上,我發現要按預期工作,除了我所問的這個連字符。 –