Saltar al contenido

Símbolo equivalente a NEQ, LSS, GTR, etc. en archivos por lotes de Windows

Basta ya de investigar en otras webs ya que llegaste al espacio indicado, contamos con la respuesta que quieres pero sin problemas.

Solución:

La razón por la que a los operadores les gusta > no se utilizan es porque tienen significados especiales en los scripts de shell. los > se utiliza para redirigir la salida; < utilizado para redirigir la entrada, etc.

La documentación de Microsoft enumera los siguientes operadores:

Operator | Description
EQU      | equal to
NEQ      | not equal to
LSS      | less than
LEQ      | less than or equal to
GTR      | greater than
GEQ      | greater than or equal to

Además la palabra not se utiliza para negar una condición.

La razón por la que quiero usar símbolos es porque pensé que alguien había dicho que los símbolos de texto o números eran más eficaces que usar las variantes de texto.

Probablemente se referían a bash y su gran catálogo de operadores. Proporciona diferentes operadores para enteros y string operandos.

El comando interno del procesador de comandos de Windows SI tiene por defecto solo dos operadores:

  1. == que ejecuta un string comparación de los dos argumentos sobre igualdad, es decir, use strcmp con la condición true sobre strcmp devolviendo 0.
  2. not en combinación con == para invertir el resultado de la string comparación en igualdad, es decir, la condición es true si las dos cadenas comparadas son no igual.

Entonces la línea de comando

if "19"=="3" echo My computer doesn't know maths

carreras strcmp con las cuerdas "19" y "3" lo que significa que los flujos de bytes comparados son hexadecimales 22 31 39 22 00 y 22 33 22 00. Las comillas dobles no se eliminan antes de ejecutar el string comparación. Las citas se incluyen en el string comparación.

Una ayuda para el mando SI se emite al ejecutar en una ventana de símbolo del sistema el comando if /?. Esta ayuda explica todas las opciones y operadores adicionales que se pueden utilizar al tener habilitadas las extensiones de comando por defecto.

Existe la opcion /I para comparar los dos argumentos que no distinguen entre mayúsculas y minúsculas usando stricmp en lugar de strcmp.

Ejemplo:

if /I not "%~1" == "/I" echo First argument is neither /i nor /I.

Existen los operadores de comparación adicionales EQU, NEQ, LSS, LEQ, GTR, GEQ con extensiones de comando habilitadas.

Los corchetes angulares < y > se utilizan en la línea de comandos de Windows como operadores de redirección. Por lo tanto, no se pueden utilizar como operadores de comparación en un SI condición. También signo de exclamación ! no está disponible como operador porque significa el inicio / fin de una referencia de variable de entorno al tener habilitada la expansión de la variable de entorno retrasada. Correr set /? y setlocal /? y endlocal /? para obtener detalles sobre el uso de la expansión de la variable de entorno retrasada.

El intérprete de comandos de Windows intenta convertir ambas cadenas de argumentos en enteros de 32 bits firmados usando strtol con base 0 (detección automática de la base) en el uso de EQU, NEQ, LSS, LEQ, GTR, GEQ. Se realiza una comparación de enteros si tiene éxito para ambas cadenas de argumentos porque las dos cadenas comparadas son

  • números decimales con el primer carácter opcional - o + y todos los demás caracteres son dígitos decimales 0123456789 sin el primer dígito 0 igual que -2147483648, -200, +10, 32, 2147483647, o
  • números hexadecimales con el primer carácter opcionalmente - o + y luego con 0x o 0X y todos los demás caracteres son dígitos hexadecimales 0123456789ABCDEFabcdef igual que -0x80000000, -0XC8, +0x0a, 0x20, 0x7fffFFFF, o
  • números octales con el primer carácter opcional - o + y después 0 y todos los demás caracteres son dígitos octales 01234567 igual que -020000000000, -0310, +012, 040, 017777777777.

De lo contrario, las dos cadenas de argumentos se vuelven a comparar con strcmp o con stricmp sobre el uso adicional /I con operador EQU, NEQ, LSS, LEQ, GTR, GEQ y el operador de comparación se aplica al resultado entero de la string función de comparación.

Nota:08 y 09 como otros por personas interpretaron números decimales con uno o más 0 conteniendo 8 o 9 se interpretan como números octales inválidos y, por lo tanto, dan como resultado un string en lugar de una comparación de enteros.

La conversión de ambos string Los argumentos para enteros de 32 bits con signo necesitan algunas instrucciones de procesador adicionales (algunos nanosegundos o microsegundos, según el rendimiento de la CPU). Por lo tanto, una comparación de enteros es un poco más lenta, pero generalmente no se nota más lenta.

Ejemplos:

if 014 EQU 12 echo Octal number 014 is equal decimal number 12.
if 0x0C EQU 12 echo Hexadecimal number 0C is equal decimal number 12.
if /I 0X0C EQU 014 Hexadecimal number 0C is equal octal number 014.

La opción /I se ignora al usar un operador de comparación que no sea == y ambas cadenas se pueden convertir correctamente en enteros de 32 bits con signo. Esto se demuestra en la tercera línea anterior. /I solo se tiene en cuenta al utilizar los operadores EQU, NEQ, LSS, LEQ, GTR, GEQ si una de las dos cadenas no se puede convertir correctamente a un número entero como en el siguiente ejemplo:

if /I "0X20" EQU "0x20" echo String "0X20" is case-insensitive equal string "0x20".

Si uno de los dos argumentos está entre comillas dobles sobre el uso de EQU, NEQ, LSS, LEQ, GTR, GEQ, o una de las dos cadenas no es un string representando un número entero válido, la comparación siempre se hace con el uso de strcmp o stricmp dependiendo del uso de /I. strcmp y stricmp devuelve un número entero como resultado, que puede ser un número negativo, cero o un número positivo. Este resultado entero se compara con el valor entero 0 según el operador utilizado.

Ejemplos:

if 010 NEQ "10" echo String 010 is not equal string "10".
if "100" LSS "20" echo String "100" is less than string "20".

En el segundo ejemplo, el segundo carácter 1 en el lado izquierdo tiene un valor de código más bajo (49 = 0x31) como segundo carácter 2 en el lado derecho (50 = 0x32) lo que resulta en strcmp devolviendo un valor negativo que resulta en function result LSS 0 ser true.

Tenga en cuenta que las variables de entorno de Windows son siempre de tipo string y necesita ser convertido siempre de string a entero en el uso de comparación de enteros o aritmética de enteros.

Es aconsejable en la mayoría de los casos utilizar string1 == string2 o not string1 == string2 en lugar de string1 EQU string2 o string1 NEQ string2 al comparar dos cadenas que no representan valores enteros para usar directamente strcmp o stricmp. De lo contrario, al comparar cadenas con EQU o NEQ solo se desperdician algunos nanosegundos o microsegundos dejando que el procesador de comandos de Windows se use por primera vez strtol que no convierte una de las dos cadenas para comparar y, por lo tanto, cmd.exe corre a continuación strcmp o stricmp ya que se haría inmediatamente en el uso del operador ==.

Un hecho más importante:

A string en lugar de una comparación de enteros sobre el uso de uno de los operadores de comparación EQU, NEQ, LSS, LEQ, GTR, GEQ es procesado por cmd.exe en ejecución de SI condición solo en caso de que uno de los dos argumentos contenga un carácter no válido. No obstante, se realiza una comparación de enteros en una condición fuera de rango, como un argumento es menor que -2147483648 o mayor que 2147483647 como se discutió en resultados extraños con IF.

La limitación del rango de valores se puede solucionar comparando dos valores como cadenas en las que ambas cadenas de valores tienen el mismo número de caracteres. Aquí hay un ejemplo para averiguar si un archivo tiene dos o más GiB, es decir, el tamaño del archivo es 2147483648 o más bytes.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" ( set "FileName=%~f0" ) else set "FileName=%~1"
for %%I in ("%FileName%") do set "FileSize=000000000000000%%~zI"
if "%FileSize:~-16%" GEQ "0000002147483648" (
    echo "%FileName%" is greater or equal 2 GiB.
) else echo "%FileName%" is less than 2 GiB.
endlocal
pause

El tamaño de archivo del archivo cuyo nombre se pasa al archivo por lotes se asigna a la variable de entorno FileSize como string con siempre al menos 15 dígitos cero adicionales al principio.

Y a continuación se compara el FileSize string con solo los últimos 16 dígitos con string 0000002147483648 que representa 2 GiB en bytes. strcmp compara las dos cadenas de igual longitud byte por byte, por lo que cada byte de las dos cadenas comparadas puede tener solo los valores hexadecimales 0x30 a 0x39. strcmp regresa inmediatamente con un valor negativo si el byte actual de la izquierda string es menor que el byte actual de la derecha string lo que significa que el tamaño del archivo es inferior a 2 GiB. strcmp regresa inmediatamente con un valor positivo si el byte actual de la izquierda string es mayor que el byte actual de la derecha string lo que significa que el tamaño del archivo es superior a 2 GiB. strcmp los retornos con cero en las dos cadenas son 100% idénticos, lo que significa que el tamaño del archivo es exactamente 2 GiB.

Tenga en cuenta que comparar valores utilizando un string La comparación requiere que ambos valores tengan el mismo número de caracteres para obtener un resultado preciso. El valor string con menos dígitos se debe anteponer con la cantidad correcta de 0.

Comentarios y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *