Opérateur de lot non égal (inégalité)

265

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

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

Qu'est-ce que je fais mal?

ripper234
la source

Réponses:

494

Essayer

if NOT "asdf" == "fdas" echo asdf
Frank Bollack
la source
106

Utilisez plutôt NEQ.

if "asdf" NEQ "fdas" echo asdf
demoncodemonkey
la source
38
cela nécessite que les extensions de commande soient activées (elles sont par défaut sur 2000+ mais peuvent être désactivées à l'échelle du système ou en tant que paramètre de cmd.exe). Normalement, vous devez les activer avec setlocal, mais pour un test simple sinon égal, il suffit d'utiliser "sinon", cela remonte au bon vieux temps DOS
Anders
30

Je sais que c'est assez dépassé, mais cela pourrait quand même être utile pour ceux qui arrivent en retard à la fête. (EDIT: mis à jour car cela génère toujours du trafic et @Goozak a souligné dans les commentaires que mon analyse initiale de l'échantillon était également incorrecte.)

J'ai tiré ceci de l'exemple de code 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, ce n'est pas le cas. Dans !ce cas, il s'agit simplement d'un espace réservé de caractère. Ça pourrait être n'importe quoi. Si %1a du contenu, alors l'égalité sera fausse, si ce n'est pas le cas, vous serez simplement comparé !à !et ce sera vrai.

!==!n'est pas un opérateur, donc écrire "asdf" !==! "fdas"n'a pas de sens.

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

jatrim
la source
Merci jatrim .. Très certainement utile pour ceux qui recherchent une réponse, plutôt que de poser à nouveau la question. Ce n'est pas comme si StackExchange bloque la possibilité de répondre / commenter en raison de l'âge des questions, alors pensez que c'est tout à fait acceptable.
user66001
4
Les !sont utilisés ici au cas où il %1est vide, ce qui entraîne le test !==!, ce qui est vrai. Vous pouvez utiliser à la %1.==.place (presque n'importe quel caractère le ferait) - le but étant de vous assurer que les deux côtés du test d'égalité ont quelque chose à tester. La !==!notation n'est certainement PAS un signe différent. Mieux vaut rester avec if not ....
Goozak
22

Essayer:

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 publié).

Dominic Rodger
la source
4

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

Je ne trouve aucune documentation mentionnant un opérande d'inégalité spécifique et équivalent pour la comparaison de chaînes (à la place de NEQ). La solution utilisant IF NOT == semble l'approche la plus solide. Je ne peux pas immédiatement penser à une circonstance dans laquelle l'évaluation des opérations dans un fichier de commandes entraînerait un problème ou un comportement inattendu lors de l'application de la méthode de comparaison IF NOT == aux chaînes.

J'aimerais pouvoir donner un aperçu de la façon dont les deux fonctions se comportent différemment à un niveau inférieur - le démontage de fichiers de commandes séparés (qui utilisent NEQ et IF NOT ==) offrirait des indices en termes d'appels d'API natifs (non officiellement documentés) conhost.exe utilise?

Paul
la source