[Batch] Problema con las variables [Solucionado]

Iniciado por DA KILLER, 15 Mayo 2010, 15:46 PM

0 Miembros y 2 Visitantes están viendo este tema.

DA KILLER

Hola, me encuentro con dos pequeños problemas.

Primer Problema:

No encuentro que estoy haciendo mal al tratar de que cuando una variable no esta definida vaya a un label, en lugar de ello el batch colapsa.

Segundo Problema:

Me gustaría que cuando el usuario inserte el valor de una variable no pueda insertar determinados caracteres que conllevan al colapso del batch.

Dejo el code para que se entienda mejor:

@echo off
title EJEMPLO VARIANTES
:menu
set/p var=Escriba TEST:
if %var%==TEST (goto Ok) else (goto wrong)
if %var% not defined goto error

:error
echo Ud. no inserto texto alguno, por favor escriba TEST.
pause >nul
cls
goto menu

:wrong
echo ERROR UD. NO INSERTO TEST, por favor vuelva a intentarlo.
pause >nul
cls
goto menu

:Ok
echo OK, todo en orden.
pause >nul
cls
exit


El Primer Problema:

No se porque cuando le doy Enter a la primera vez, es decir sin definir %var% en lugar de ir a error se cierra el programa.

Probé de hacer lo siguiente:

-> Cambiar el orden del "if not defined"

if not defined %var% goto error

-> Sacar los "%"

if var not defined goto error
if not defined var goto error

Y ninguno me funcionó.

El Segundo Problema:

Mi intención es que si el usuario inserta alguno de los sig. caracteres el programa no colapse:

CARACTERES: & >< |

Así como si el usuario ingresa un espacio dentro del texto tampoco lo haga.

Para esto intente lo siguiente:

-> Poner comillas dobles en la variante (como cuando de trabaja con rutas)

set/p "var=Escriba TEST:"

-> Poner "^" después del texto (como cuando se quiere ingresar caracteres reservados [EJ: ^&])

set/p var=Escriba TEST: ^

Así me devolvió: "if ==TEST (goto Ok) else (goto wrong)", y al insertar un caracter colapsó.

set/p "var=Escriba TEST: "^

Al hacer esto no me devolvió la cadena, pero igual colapsa.

Espero mi duda sea entendible.

Desde Ya gracias por su ayuda.



.: DA KILLER :.



DA KILLER

Ah me olvidaba, me podrían explicar como funciona el comando "~% dp0"

Gracias y saludos
.: DA KILLER :.



flony

#2
el primer problema es que pones set/p var=Escriba TEST: deberia ser echo escriba TEST para ingresar
set/p var=TEST

solo estaba mal declarada..el tema de los signos al no ser la variable ddeclarada lo envia a  wrong y listo
si un problema no tiene solucion entonces no es un problema...es algo inevitable

DA KILLER

Cita de: flony en 15 Mayo 2010, 18:18 PM
el primer problema es que pones set/p var=Escriba TEST: deberia ser echo escriba TEST para ingresar
set/p var=TEST

solo estaba mal declarada..el tema de los signos al no ser la variable ddeclarada lo envia a  wrong y listo

No me has entendido, ademas lo que va luego del igual es un texto sin valor, si tu te fijas al poner ese codigo te saldrá:

escriba TEST para ingresar
TEST

Y lo de los signos es que son caracteres de redireccionamiento lo que causa que el programa colapse.
.: DA KILLER :.



DA KILLER

Lo que tu dices es declarar una variable fija [EJ: set test==TEST]
Lo que yo digo son errores que causa el usuario cuando se le pide que ingrese un valor, y por error ingresa un símbolo de redireccionamiento.

Para que me entiendas copia este code:


@echo off
set ej==Texto de ejemplo
echo Lo que tu quieres hacer es dar un valor FIJO, como lo es la variable "ej":
echo.
echo %ej%
echo.
echo Lo que YO quiero hacer es pedir al usuario un valor, como en la variable "test":
echo.
set/p test=Introduzca un numero:
echo.
echo Ud. ha ingresado %test%
echo.
pause >nul


Ahora fijate que pasa si cuando te pide un numero tu pones cualquiera de estos símbolos: > < | &
O que pasa cuando insertas dos números separados por un espacio: 1 0

Si quieres ahorrar tiempo, el programa colapsa.

Por ello yo quiero que el usuario NO PUEDA utilizar dichos símbolos.
.: DA KILLER :.



DA KILLER

Miren el codigo sería algo así:


@echo off
title ERROR CON LAS VARIABLES
echo  -= Inserte "KILLER" =-
echo.
Set/p test=
if %test%==KILLER (goto OK) else (goto wrong)
if %test% not defined goto ERROR
:error
cls
echo No insertaste texto, vuelve a intentarlo.
pause >nul
cls
goto menu
:OK
cls
echo OK, Lo hiciste bien
pause >nul
exit

:wrong
cls
echo No insertaste KILLER
pause >nul
cls
goto menu


Los errores están más arriba

PD: Casi me olvido, por si influye trabajo con DOS v 5.1.2600 - Windows XP Profesional 2002 SP 2

De nuevo gracias por su tiempo
.: DA KILLER :.



leogtz

Se dicen "variables", primero corrige eso.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

DA KILLER

#7
:$ sip, se me pasó por escribir rápido, gracias Leo.

Ya está arreglado.
.: DA KILLER :.



leogtz

No he leído la totalidad del post, pero respecto a la duda principal:

CitarNo encuentro que estoy haciendo mal al tratar de que cuando una variable no esta definida vaya a un label, en lugar de ello el batch colapsa.

Eso lo puedes hacer con if, mira:

if not defined variable (goto:label)

Aquí no es necesario los % %.

A lo segundo, ya se ha hablado bastante en el foro sobre filtros Batch.

Busca sobre "anti batch inyection".
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

DA KILLER

Ah OK, me faltaban los paréntesis, luego leo el otro tutorial, y me gustaría que me aclares lo del comando "~% dp0"

Gracias y saludos.
.: DA KILLER :.