2017-10-16 43 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