Operador de lote no igual (desigualdad)

264

De acuerdo con esto , !==!es el operador de cadena no igual. Al intentarlo, obtengo:

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

¿Qué estoy haciendo mal?

ripper234
fuente

Respuestas:

493

Tratar

if NOT "asdf" == "fdas" echo asdf
Frank Bollack
fuente
105

Use NEQ en su lugar.

if "asdf" NEQ "fdas" echo asdf
demoncodemonkey
fuente
37
esto requiere que las extensiones de comando estén activadas (están predeterminadas en 2000+ pero pueden desactivarse en todo el sistema o como un parámetro para cmd.exe) Normalmente, debe activarlas con setlocal, pero para una prueba simple, si no igual, sólo tiene que utilizar "si no", que se remonta a los viejos días del DOS
Anders
29

Sé que esto está bastante desactualizado, pero aún podría ser útil para aquellos que llegan tarde a la fiesta. (EDITAR: actualizado ya que esto todavía recibe tráfico y @Goozak ha señalado en los comentarios que mi análisis original de la muestra también era incorrecto).

Saqué esto del código de ejemplo en su enlace:

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==!es simplemente un uso idiomático de la ==intención de verificar que la cosa de la izquierda, que contiene su variable, es diferente de la de la derecha, eso no. En !este caso, es solo un marcador de posición de personaje. Podría ser cualquier cosa. Si %1tiene contenido, entonces la igualdad será falsa, si no vas a estar comparando !a !y será verdad.

!==!no es un operador, por lo que escribir "asdf" !==! "fdas"es bastante absurdo.

La sugerencia de uso if not "asdf" == "fdas"es definitivamente el camino a seguir.

jatrim
fuente
Gracias Jatrim . Definitivamente útil para aquellos que buscan una respuesta, en lugar de hacer la pregunta nuevamente. No es que StackExchange bloquee la capacidad de responder / comentar debido a la antigüedad de las preguntas, así que piense que esto es completamente aceptable.
user66001
44
Se !usan aquí en caso de que %1esté vacío, lo que resulta en la prueba !==!, que es cierto. En su %1.==.lugar, podría usar (casi cualquier personaje lo haría), con el propósito de asegurarse de que ambos lados de la prueba de igualdad tengan algo que probar. La !==!notación definitivamente NO es un signo no igual. Mejor quédate con if not ....
Goozak
22

Tratar:

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

Eso funciona para mí en Windows XP (obtengo el mismo error que tú para el código que publicaste).

Dominic Rodger
fuente
4

NEQ se usa generalmente para números y == se usa típicamente para comparación de cadenas.

No puedo encontrar ninguna documentación que mencione un operando de desigualdad específico y equivalente para la comparación de cadenas (en lugar de NEQ). La solución usando IF NOT == parece el enfoque más sólido. No puedo pensar de inmediato en una circunstancia en la que la evaluación de las operaciones en un archivo por lotes pueda causar un problema o un comportamiento inesperado al aplicar el método de comparación IF NOT == a las cadenas.

Desearía poder ofrecer una idea de cómo se comportan las dos funciones de manera diferente en un nivel inferior: si desarma los archivos por lotes separados (que usan NEQ e IF NOT ==) ofrecería alguna pista en términos de qué API nativas (no documentadas) llama a conhost.exe está utilizando?

Pablo
fuente