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.
Interesante 0x0309, no se me había ocurrido.