2017-10-16 2 views
0

Pourquoi, dans une fenêtre de commande Windows 7, fait la comparaison de chaînescomparaison de chaînes de fichier bat fonctionner de façon inattendue

if "-e" geq "d" echo yes 

écho yes? Il semble qu'aucun nombre de traits d'union principaux dans l'argument de chaîne de gauche ne soit ignoré.

Mon besoin sous-jacent est une réponse fournissant un moyen fiable de comparer lexicographiquement deux chaînes pour la magnitude.

+0

Vous ne pouvez pas faire une comparaison arithmétique sur une chaîne! – RGuggisberg

+0

Je pensais que les guillemets en feraient une comparaison lexicographique. Ma compréhension est le "si" les opérateurs de comparaison comprennent et compareront les chaînes, étant donné que les deux arguments sont placés entre guillemets. Et en effet, j'ai trouvé cela pour fonctionner comme prévu, sauf pour ce cas de trait d'union dont je parle. –

Répondre

0

Document de

(Pas une réponse, mais les commentaires ne peuvent pas remplir la tâche)

@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 

La démonstration ci-dessus montre que l'observation de l'OP apparaît tout à fait valable.

Les chaînes du for sont fournies aux deux sous-programmes; le premier effectuant la comparaison avec le résultat attendu et le second avec les mêmes arguments, mais avec tous les - supprimés et aucun commentaire quant au résultat attendu.

Les résultats pour (sic) contre (traitées) sont cohérentes, montrant que le - semble être ignoré - et non seulement si elle apparaît d'abord à une exception flagrante

L'exception est le tout dernier exemple. "72" geq? "7-2" renvoie "false" où "true" est logique. Si la comparaison est strictement alphabétique, alors 2 est supérieur à - d'où «vrai». Si le - est ignoré, alors 72 et 72 sont les mêmes, d'où «vrai». Même si le calcul 72 geq 5 a été fait, le résultat serait "vrai".

Alors, quel est le problème? - n'est pas simplement attribué bizarrement une valeur de classement>z, ou -e serait>d.

Je me demande si le - est ignoré, mais 72 est une chaîne plus courte que 7-2, c'est pourquoi cette comparaison retourne "faux".

Plus d'yeux ont besoin de cela, je crois. Encore une autre entrée pour le livre de bizarreries ...

+0

Selon 'if /?', "Si les deux string1 et string2 sont tous deux composés de tous les chiffres numériques, alors les chaînes sont convertis en nombres et une comparaison numérique est effectuée." Est-il possible que les opérateurs arithmétiques soient considérés comme des chiffres numériques (même s'ils ne le sont pas)? – SomethingDark

+0

@SomethingDark: tout à fait possible - un '-' dans une position non-initiale peut être' 15' disons, donc '7-2' serait 7 * 100 + 15 * 10 + 2 donc plus grand que' 72' – Magoo

+0

Aren ' t espaces ignorés aussi pour les comparaisons de chaînes? Je pense que les espaces et les traits d'union (et d'autres caractères aussi?) Sont considérés comme une sorte de séparateurs de mots, qui sont ignorés pour comparer et trier ... – aschipfl