316 votes

Opérateur de non-égalité (inégalité) par lot

Selon este , !==! est l'opérateur de chaîne non égale. En l'essayant, j'obtiens :

C:\> if "asdf" !==! "fdas" echo asdf
!==! was unexpected at this time.

Qu'est-ce que je fais de mal ?

589voto

Frank Bollack Points 10208

Essayez

if NOT "asdf" == "fdas" echo asdf

129voto

demoncodemonkey Points 4812

Utilisez plutôt NEQ.

if "asdf" NEQ "fdas" echo asdf

48 votes

Cela nécessite que les extensions de commande soient activées (elles le sont par défaut sur 2000+ mais peuvent être désactivées dans tout le système ou en tant que paramètre de cmd.exe). Normalement, vous devriez les activer avec setlocal, mais pour un simple test "if not equal", utilisez simplement "if not", cela revient à l'époque du bon vieux DOS.

34voto

jatrim Points 375

Je sais que c'est un peu dépassé, mais cela peut encore être utile pour ceux qui arrivent tard dans la soirée. (EDIT : mis à jour puisque cela reçoit encore du trafic et que @Goozak a signalé dans les commentaires que mon analyse originale de l'échantillon était également incorrecte).

J'ai tiré ceci du code d'exemple dans votre lien :

IF !%1==! GOTO VIEWDATA
REM  IF NO COMMAND-LINE ARG...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  PRINT LINE WITH STRING MATCH, THEN EXIT.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  SHOW ENTIRE FILE, 1 PAGE AT A TIME.

:EXIT0

!%1==! est simplement une utilisation idiomatique de == destinée à vérifier que la chose de gauche, qui contient votre variable, est différente de la chose de droite, qui ne la contient pas. Le site ! dans ce cas, est juste un caractère de remplacement. Cela peut être n'importe quoi. Si %1 a un contenu, alors l'égalité sera fausse, si ce n'est pas le cas vous comparerez simplement ! à ! et ce sera vrai.

!==! n'est pas un opérateur, donc écrire "asdf" !==! "fdas" est assez absurde.

La suggestion d'utiliser if not "asdf" == "fdas" est définitivement la voie à suivre.

0 votes

Gracias jatrim .. Très certainement utile pour ceux qui cherchent une réponse, plutôt que de reposer la question. Ce n'est pas comme si StackExchange bloquait la possibilité de répondre/commenter en raison de l'ancienneté des questions, donc je pense que c'est tout à fait acceptable.

4 votes

El ! sont utilisés ici au cas où %1 est vide, ce qui donne lieu au test !==! ce qui est vrai. Vous pourriez utiliser %1.==. à la place (presque n'importe quel caractère ferait l'affaire) - le but étant de s'assurer que les deux côtés du test d'égalité a quelque chose à tester. Le site !==! La notation est définitivement PAS un signe non égal. Mieux vaut s'en tenir à if not ... .

1 votes

Oui, j'utilise généralement 'if X%1 == X goto somewhere' pour vérifier si le script n'a pas d'arguments. C'est la même chose que 'if "%1" == "" goto somewhere', sauf que cela échouera dans les fichiers batch, parce que "" n'évalue rien et que la phrase entière se réduit à 'if %1 == goto somewhere'. Je préfère X, car ! vous fait penser qu'il s'agit d'un opérateur spécial, alors qu'il est juste utilisé comme un caractère supplémentaire pour surmonter le problème d'une chaîne vide. Les fichiers batch sont des reliques des années 1980...

27voto

Dominic Rodger Points 44489

Essayez :

if not "asdf" == "fdas" echo asdf

Cela fonctionne pour moi sur Windows XP (j'obtiens la même erreur que vous pour le code que vous avez posté).

7voto

Paul Points 51

NEQ est généralement utilisé pour les nombres et == pour la comparaison de chaînes de caractères.

Je ne trouve aucune documentation qui mentionne une opérande d'inégalité spécifique et équivalente pour la comparaison de chaînes de caractères (à la place de NEQ). La solution utilisant IF NOT == semble la plus judicieuse. Je n'arrive pas à penser immédiatement à une circonstance dans laquelle l'évaluation des opérations dans un fichier batch causerait un problème ou un comportement inattendu lors de l'application de la méthode de comparaison IF NOT == aux chaînes de caractères.

J'aimerais pouvoir donner un aperçu de la façon dont les deux fonctions se comportent différemment à un niveau inférieur - est-ce que le désassemblage de fichiers batch séparés (qui utilisent NEQ et IF NOT ==) donnerait des indices sur les appels d'API natifs (officieusement documentés) utilisés par conhost.exe ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X