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.
Ah me olvidaba, me podrían explicar como funciona el comando "~% dp0"
Gracias y saludos
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
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.
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.
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
Se dicen "variables", primero corrige eso.
:$ sip, se me pasó por escribir rápido, gracias Leo.
Ya está arreglado.
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".
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.
Son tipos de variables que pueden ser usadas de esta manera:
%~d0
Donde "0" hace referencia al mismo archivo batch.
La letra d, hace referencia al disco (drive)
Si yo hiciera esto:
%~dp1
Estaría haciendo referencia a la variable %1 posicional, más (drive) y el path o la ruta.
Aquí tienes más información:
http://foro.elhacker.net/scripting/programacion_batch_avanzada_nuevo-t132924.0.html
Para lo de los caracteres especiales te servirá mi script:
http://foro.elhacker.net/scripting/fbat_pequeno_filtro_by_xassiz-t265981.0.html (http://foro.elhacker.net/scripting/fbat_pequeno_filtro_by_xassiz-t265981.0.html)
OK el filtro de xassiz me ayudo con los caracteres reservados, pero sigue sin tomarme el if not defined, apenas lo solucione lo posteo completo y corregido.
tenes razon las variables se ingresan == y no = y tal vez por ahi el declarar las variables se te complique en set/p var=Escriba TEST:
y test no sea una variable
Cita de: DA KILLER en 17 Mayo 2010, 00:38 AM
, pero sigue sin tomarme el if not defined
La estructura de if not defined es "
if not defined variable"
set variable=hola
if not defined %variable% (echo:Variable no definida)
Así estás haciendo tú, el cmd lo interpreta así:
set variable=hola
if not defined hola (echo:Variable no definida)
A que me refiero? Que no la tienes que expandir:
set variable=hola
if not defined variable (echo:Variable no definida)
[code@echo off
title EJEMPLO VARIANTES
:menu
echo escriba TEST
set/p var=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
ahi ta funciona eso era lo q te decia, eso si funciona con mayusculael TEST si queres ponelo en minuscula pones lo q sea y no funciona solo TEST
No, lo que pasa es que al emplear el filtro de xassiz se pre-define la variable a tratar para el "filtrado" pero es una bolud** arreglarlo, ahora busco el code y la rta.
El code es:
set "test="&set/p "test= Password: "
for %%a in ("^","&","<",">","|"," ",",") do (set "test=!pass:%%~a=^%%~a!")
Al hacer esto se "pre-define" la variable "test", pero si reemplazamos el 1er "test" por no se "ej" si funciona, EJ:
set "ej="&set/p "test=Ingrese KILLER: "
for %%a in ("^","&","<",">","|"," ",",") do (set "ej=!test:%%~a=^%%~a!")
Saludos y gracias.
PD: Perdón por no conectarme antes, pero tengo un troyano dando vueltas que me tiene como loco :P
Bueno, queda solucionado el tema al menos que alguien no entienda algo más.