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 ...
Vous ne pouvez pas faire une comparaison arithmétique sur une chaîne! – RGuggisberg
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. –