elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Batch] (IF diferencia equ y == ) (SET /A Diferencia entre %v% y v)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Batch] (IF diferencia equ y == ) (SET /A Diferencia entre %v% y v)  (Leído 7,999 veces)
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
[Batch] (IF diferencia equ y == ) (SET /A Diferencia entre %v% y v)
« en: 2 Mayo 2009, 21:44 pm »

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

Ejemplo:

Código:
set cincuenta=50
set /a numero1=cincuenta
set /a numero2=%cincuenta%
echo.numero1:%numero1%
echo.numero2:%numero2%
produce:
Código:
numero1:50
numero2:50

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

ejemplo:
Código:
set n=5
set c=n
set /a n1=c
set /a n2=%c%
echo.n1:%n1%
echo.n2:%n2%
produce:
Código:
n1:0
n2:5
Esto es porque, al presionar enter aquí:
Código:
set /a n2=%c%
cmd expande o reemplaza %c% por: el contenido de c es decir n, por lo que envía:
Código:
set /a n2=n
y n2 queda en 5

En cambio:
Código:
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:

Código:
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:
Código:
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:

Código:
(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:
Código:
set n=3
set /a numero1=0xn
set /a numero2=0n
pero si:
Código:
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
Código:
set ocho=08
set n=0x%ocho%
Pero como esto no funcionaría así:
Código:
set ocho=08
set /a n=0xocho

Puede hacerse lo siguiente:

Código:
set ocho=08
set nueve=09
if %ocho% equ 8 set ocho=8
if %nueve% equ 9 set nueve=9
y luego:
Código:
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:
Código:
@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.


« Última modificación: 2 Mayo 2009, 22:02 pm por 0x0309 » En línea

M a t t

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: [Batch] (IF diferencia equ y == ) (SET /A Diferencia entre %v% y v)
« Respuesta #1 en: 2 Mayo 2009, 22:48 pm »

Interesante 0x0309, no se me había ocurrido.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda: diferencia entre tipos de MiM y envenenamiento
Hacking
kiqueW 2 3,379 Último mensaje 29 Noviembre 2010, 16:48 pm
por kiqueW
diferencia entre una etiqueta y otra
Desarrollo Web
javierr 1 2,397 Último mensaje 11 Enero 2011, 14:02 pm
por madpitbull_99
Ayuda con diferencia entre MVC y MVC++
PHP
ZedGe 1 6,122 Último mensaje 9 Noviembre 2012, 05:24 am
por Shell Root
Cual es la diferencia entre estos dos scripts (batch)
Programación General
juntacadaveres 2 2,394 Último mensaje 25 Abril 2019, 22:59 pm
por Tachikomaia
Diferencia entre Batch y Python
Scripting
Mr. Bit 3 3,467 Último mensaje 21 Mayo 2022, 01:42 am
por .xAk.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines