[Batch] Se me cae el script

Iniciado por VivaElPirateo, 21 Mayo 2012, 00:29 AM

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

VivaElPirateo

Buenas tardes:

Estoy haciendo un script (.bat), el cual se debe poner las opciones a elegir entre la 1 y la 8. Tengo las opciones para validar que el usuario no pona letras y números que no correspondan, pero, acá va el drama:

Al poner un solo escpacio (presionar aunque sea una vez el botón de la tecla espaciadora), se me cae el programa.

Necesito saber si existiese una opción para validar esto o, en el peor de los casos, deshabilitar la tecla espaciadora en el script punto bat.


Dejo el código por si acaso:

Código (dos) [Seleccionar]

[b]:numeros
set /p "op=Ingrese una opcion:"
if not defined op goto numeros
set "variable=false"
for /f "delims=abcdefghijklmnopqrstuvwxyz" %%a in ("%op%") do set "variable=true"
if "%variable%"=="true" (
if %op% GTR 8 (
echo Ingrese solo numeros del 1 al 8
goto numeros
)
if %op% LSS 1 (
echo Ingrese solo numeros del 1 al 8
goto numeros
)
goto opcion
) else (
echo No puede ingresar Caracteres.
goto numeros
)[/b]


Cualquier ayuda se agradece!!!

$Edu$

Jeje no necesitas hacer todo eso.. un menu se hace asi:

Código (dos) [Seleccionar]

:menu
cls
echo+
echo+
echo              1.- Ver datos de autor.
echo              2.- Mirar mensaje.
echo              3.- Salir del programa.
echo+
echo+
set "opcion="
set /p "opcion= elija a donde desea ir: "
if not defined opcion (goto menu)
if %opcion%==1 (goto :autor)
if %opcion%==2 (goto :mensaje)
if %opcion%==3 (goto :salir) 
goto :menu


Con esto queda mejor, porque no muestra ningun mensaje de error, sino que no hace nada.
Lo de set "opcion=" es para que las siguientes veces que vuelva al menu, se borre el contenido de %opcion% para que si el usuario pone enter sin escribir nada, no vaya a donde fue la vez anterior.

Eleкtro

#2
Vaya lio tienes montado... El FOR no es para este tipo de cosas, Ni tampoco es necesario crear cientos de condicionales  :P.
Te recomiendo que leas acerca de los comandos FIND, FINDSTR, y CHOICE.

Otras alternativas de menúes aparte de la que comentó $Edu$:


Menú V.1

Código (dos) [Seleccionar]
@echo off

:: Solo son seleccionables del número 1 al 8.
:: Nota: No muestra ningún error al escribir un espacio o "&" "=" o un número diferente.

:Select
cls
Set op=NUL
set /p "op=Ingrese una opcion: "
Echo "%OP%" | FINDSTR "\<[1-8]\>" >NUL || (Goto :Select)
Goto :Opcion%OP%

:Opcion1
Echo Has elegido la Opcion 1 & pause & Goto :Select
:Opcion2
Echo Has elegido la Opcion 2 & pause & Goto :Select
:Opcion3
Echo Has elegido la Opcion 3 & pause & Goto :Select
:Opcion4
Echo Has elegido la Opcion 4 & pause & Goto :Select
:Opcion5
Echo Has elegido la Opcion 5 & pause & Goto :Select
:Opcion6
Echo Has elegido la Opcion 6 & pause & Goto :Select
:Opcion7
Echo Has elegido la Opcion 7 & pause & Goto :Select
:Opcion8
Echo Has elegido la Opcion 8 & pause & Goto :Select



Menú V.2
Código (dos) [Seleccionar]
@echo off

:: Solo son seleccionables del número 1 al 8.
:: No muestra ningún error al escribir un espacio o un número diferente.

:Select
cls
CHOICE /C 12345678 /M "Ingrese una opcion: "
Goto :Opcion%Errorlevel%

:Opcion1
Echo Has elegido la Opcion 1 & pause & Goto :Select
:Opcion2
Echo Has elegido la Opcion 2 & pause & Goto :Select
:Opcion3
Echo Has elegido la Opcion 3 & pause & Goto :Select
:Opcion4
Echo Has elegido la Opcion 4 & pause & Goto :Select
:Opcion5
Echo Has elegido la Opcion 5 & pause & Goto :Select
:Opcion6
Echo Has elegido la Opcion 6 & pause & Goto :Select
:Opcion7
Echo Has elegido la Opcion 7 & pause & Goto :Select
:Opcion8
Echo Has elegido la Opcion 8 & pause & Goto :Select











VivaElPirateo

#3
Tengo lo siguiente hecho:
Código (dos) [Seleccionar]

@echo off
:inicio


set var=    
set /p var=         Ingrese un numero entre el 1 y el 8 :
echo.

for /f "tokens=1* delims=12345678" %%a in ("A0%var:"=%") do if not "%%b"=="" echo No sea porfiado, hombre!!!!! ELIJA SOLAMENTE NUMEROS ENTRE EL 1 Y EL 8.
echo.
pause
goto inicio

if %var%==1 goto opcion1
if %var%==2 goto opcion2
if %var%==3 goto opcion3
if %var%==4 goto opcion4
if %var%==5 goto opcion5
if %var%==6 goto opcion6
if %var%==7 goto opcion7
if %var%==8 goto opcion8
if %var% GTR 8 echo          Error de seleccion: la opcion no es valida (Elija entre 1 y 8)




Con esto logro retener los errores y manda un mensaje de error al usuario, pero no logro que al poner cualquiera de las opciones señalas me envíe ahí hacia ellas.

Qué hago???




Cita de: $Edu$ en 21 Mayo 2012, 02:34 AM
Jeje no necesitas hacer todo eso.. un menu se hace asi:

Código (dos) [Seleccionar]

:menu
cls
echo+
echo+
echo              1.- Ver datos de autor.
echo              2.- Mirar mensaje.
echo              3.- Salir del programa.
echo+
echo+
set "opcion="
set /p "opcion= elija a donde desea ir: "
if not defined opcion (goto menu)
if %opcion%==1 (goto :autor)
if %opcion%==2 (goto :mensaje)
if %opcion%==3 (goto :salir) 
goto :menu


Con esto queda mejor, porque no muestra ningun mensaje de error, sino que no hace nada.
Lo de set "opcion=" es para que las siguientes veces que vuelva al menu, se borre el contenido de %opcion% para que si el usuario pone enter sin escribir nada, no vaya a donde fue la vez anterior.



Al poner en el teclado algo así como:

dsalf kpuyt3iriue4thy7uyudfiuh c   uy8 t48749 kdsur hkethg3uerf34!"·$%&/

El programa se te va a caer: ya te lo boté.
Eso es lo que no quiero.




Los signos = y el &
igual botan ese script.

Alguna idea de cómo solucionar esto???

Millón de gracias por las respuestas!!!


A todo esto: el menú V2 no corre.

Eleкtro

#4
Cita de: VivaElPirateo en 21 Mayo 2012, 04:45 AM
Código (dos) [Seleccionar]
set /p var=         Ingrese un numero entre el 1 y el 8 :
for /f "tokens=1* delims=12345678" %%a in ("A0%var:"=%") do if not "%%b"=="" echo No sea porfiado, hombre!!!!! ELIJA SOLAMENTE NUMEROS ENTRE EL 1 Y EL 8.


Con esto logro retener los errores y manda un mensaje de error al usuario, pero no logro que al poner cualquiera de las opciones señalas me envíe ahí hacia ellas.

Mal.

VivaElPirateo, Como ya he explicado no necesitas un FOR para delimitar nada ni hacer esas cosas, Lee la respuesta de $Edu$, Que está muy bien explicada y detallada, Y Luego si quieres lee la mia.

Se te han dado 3 soluciones que te sirven, Hacen exactamente lo que pides, Leelas atentamente y aplicalas a tu code, Deja el FOR.


PD: El menú v.2 no te funciona porque usas Windows XP y los parámetros del comando choice cambian.

PD2: Lee las normas.

Salu2








$Edu$

"Los signos = y el &
igual botan ese script."

Tienes razon, no sabia eso. Pasa tambien en el codigo que dejo elektro.

Tu intencion entonces es hacer que no se cierre la ventana con esos simboles siquiera? no tengo ni idea, pero te digo que queda feo un mensaje de error, mas vale haces como hace mi codigo que no muestra ningun mensaje, solamente no hace nada hasta que ingresa un valor correcto. Solo que a mi codigo tendrias que agregarle la parte para que no se cierre si ingresa & o = y tal vez algun otro simbolo..

Eleкtro

#6
Cita de: $Edu$ en 21 Mayo 2012, 06:16 AM
"Los signos = y el &
igual botan ese script."

Pasa tambien en el codigo que dejo elektro.

Lo he solucionado con unas comillas dobles xD.

salu2

EDITO: y la misma solución en el code de $Edu$

Código (dos) [Seleccionar]
if "%opcion%"=="1" (goto :autor)
if "%opcion%"=="2" (goto :mensaje)
if "%opcion%"=="3" (goto :salir) 


PD: El problema es que al no cerrar la variable, & se toma como una instrucción del operador, Y no como un string...

salu2








$Edu$

#7
Jeje tienes razon, ahora si queda bien.

Eleкtro

Cita de: $Edu$ en 21 Mayo 2012, 06:35 AM
Yo le agregue al mio solo una comilla doble, I win :P

Siento decepcionarte, Pero...  :-\ No funciona xD

Al agregarle la comilla donde la has agregado, No se le da ningún valor a la variable, Por eso pongas lo que pongas no da error XD


salu2








$Edu$

De que me hablas? no se que habras leido.. yo no puse nada.. jajaja, me voy chauuu