[Batch] (IF diferencia equ y == ) (SET /A Diferencia entre %v% y v)

Iniciado por 0x0309, 2 Mayo 2009, 21:44 PM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

En SET /A dentro de una expresión pueden utilizarse los nombres de variables sin los % % a cada costado.

Ejemplo:


set cincuenta=50
set /a numero1=cincuenta
set /a numero2=%cincuenta%
echo.numero1:%numero1%
echo.numero2:%numero2%

produce:

numero1:50
numero2:50


En este caso se produce exactamente el mismo resultado. Sin embargo, en determindas situaciones esto puede ser diferente.

ejemplo:

set n=5
set c=n
set /a n1=c
set /a n2=%c%
echo.n1:%n1%
echo.n2:%n2%

produce:

n1:0
n2:5

Esto es porque, al presionar enter aquí:
set /a n2=%c% cmd expande o reemplaza %c% por: el contenido de c es decir n, por lo que envía:

set /a n2=n

y n2 queda en 5

En cambio:

set /a n1=c

produce 0 porque c no contiene un número, o porque no estaba definida.

Esto demuestra que puede ser mejor escribir las variables dentro de set/a con las % al costado.

Aún así, escribir las variables dentro de set/a sin % puede ser útil para lo siguiente:


set /p numero=ingrese numero:
set /a numero=%numero%

si solo se presiona enter, se hace lo siguiente:
set /a numero=
y se recibe un mensaje de error.
Ahora si se hace:

set /p numero=ingrese numero:
set /a numero=numero

numero queda en 0 porque numero es una variable no definida, pero si el contenido de la variable numero inicialmente fuera el nombre de una variable que contiene un numero, numero no quedaría en 0 por contener una palabra, y quizás no deseamos eso.

Una óptima solución es:


(set numero=)
set /p numero=ingrese numero:
if not defined numero set numero=0
set /a numero=%numero%


Escribir las variables sin % también, puede traer un problema, que es que se pierde la notación hexadecimal y octal, es decir:
No se puede hacer:

set n=3
set /a numero1=0xn
set /a numero2=0n

pero si:

set n=3
set /a numero1=0x%n%
set /a numero2=0%n%


Algo útil que se pierde también con perder la notación hexadecimal y octal es una solución para el típico problema de asignar 08 o 09 a un set /a , que no se puede porque en notación octal no existe el 8 ni el 9, y que consiste en hacer lo siguiente:

Anteponer 0x.
08 no es un número válido
09 no es un número válido
Así:
0x08 es un número válido
0x09 es un número válido

set ocho=08
set n=0x%ocho%

Pero como esto no funcionaría así:

set ocho=08
set /a n=0xocho


Puede hacerse lo siguiente:


set ocho=08
set nueve=09
if %ocho% equ 8 set ocho=8
if %nueve% equ 9 set nueve=9

y luego:

set /a n=ocho

Lo que hacemos con el comando if es dejar el número en notación decimal.
Nota: debe ser con la variable no encerrada entre comillas y con equ. No es lo mismo == que equ, pues == compara cadenas, es equivalente a equ con comillas.
Para comparar números debe hacerse como lo mostré, de lo contrario se toma como cadenas.
Demostración:

@echo off

set n=5

if %n%==5 echo 1
if %n%==05 echo 2
if %n%==0x5 echo 3

if "%n%"=="5" echo 4
if "%n%"=="05" echo 5
if "%n%"=="0x5" echo 6

if /i "%n%"=="5" echo 7
if /i "%n%"=="05" echo 8
if /i "%n%"=="0x5" echo 9

if %n% equ 5 echo 10
if %n% equ 05 echo 11
if %n% equ 0x5 echo 12

if "%n%" equ "5" echo 13
if "%n%" equ "05" echo 14
if "%n%" equ "0x5" echo 15

if /i "%n%" equ "5" echo 16
if /i "%n%" equ "05" echo 17
if /i "%n%" equ "0x5" echo 18

pause


La única salida que demuestra una comparación númerica son la de las opciones 10,11,12, el resto son comparaciones de cadenas.

Nota: pareciera que con la opción /i se logra comparación númerica aún encerrando la variable y su comparación entre comillas, pero lo único que hace es no considerar los ceros iniciales.

Para usar equ se deben tener las extensiones de comando habilitadas.

Escrito por Carlos.

M a t t