Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: VivaElPirateo en 21 Mayo 2012, 00:29 am



Título: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 21 Mayo 2012, 00:29 am
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
  1. [b]:numeros
  2. set /p "op=Ingrese una opcion:"
  3. if not defined op goto numeros
  4. set "variable=false"
  5. for /f "delims=abcdefghijklmnopqrstuvwxyz" %%a in ("%op%") do set "variable=true"
  6. if "%variable%"=="true" (
  7. if %op% GTR 8 (
  8. echo Ingrese solo numeros del 1 al 8
  9. goto numeros
  10. )
  11. if %op% LSS 1 (
  12. echo Ingrese solo numeros del 1 al 8
  13. goto numeros
  14. )
  15. goto opcion
  16. ) else (
  17. echo No puede ingresar Caracteres.
  18. goto numeros
  19. )[/b]
  20.  

Cualquier ayuda se agradece!!!


Título: Re: Se me cae el script
Publicado por: $Edu$ en 21 Mayo 2012, 02:34 am
Jeje no necesitas hacer todo eso.. un menu se hace asi:

Código
  1. :menu
  2. cls
  3. echo              1.- Ver datos de autor.
  4. echo              2.- Mirar mensaje.
  5. echo              3.- Salir del programa.
  6. set "opcion="
  7. set /p "opcion= elija a donde desea ir: "
  8. if not defined opcion (goto menu)
  9. if %opcion%==1 (goto :autor)
  10. if %opcion%==2 (goto :mensaje)
  11. if %opcion%==3 (goto :salir)  
  12. goto :menu
  13.  

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.


Título: Re: Se me cae el script
Publicado por: Eleкtro en 21 Mayo 2012, 03:15 am
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
  1. @echo off
  2.  
  3. :: Solo son seleccionables del número 1 al 8.
  4. :: Nota: No muestra ningún error al escribir un espacio o "&" "=" o un número diferente.
  5.  
  6. :Select
  7. cls
  8. Set op=NUL
  9. set /p "op=Ingrese una opcion: "
  10. Echo "%OP%" | FINDSTR "\<[1-8]\>" >NUL || (Goto :Select)
  11. Goto :Opcion%OP%
  12.  
  13. :Opcion1
  14. Echo Has elegido la Opcion 1 & pause & Goto :Select
  15. :Opcion2
  16. Echo Has elegido la Opcion 2 & pause & Goto :Select
  17. :Opcion3
  18. Echo Has elegido la Opcion 3 & pause & Goto :Select
  19. :Opcion4
  20. Echo Has elegido la Opcion 4 & pause & Goto :Select
  21. :Opcion5
  22. Echo Has elegido la Opcion 5 & pause & Goto :Select
  23. :Opcion6
  24. Echo Has elegido la Opcion 6 & pause & Goto :Select
  25. :Opcion7
  26. Echo Has elegido la Opcion 7 & pause & Goto :Select
  27. :Opcion8
  28. Echo Has elegido la Opcion 8 & pause & Goto :Select


Menú V.2
Código
  1. @echo off
  2.  
  3. :: Solo son seleccionables del número 1 al 8.
  4. :: No muestra ningún error al escribir un espacio o un número diferente.
  5.  
  6. :Select
  7. cls
  8. CHOICE /C 12345678 /M "Ingrese una opcion: "
  9. Goto :Opcion%Errorlevel%
  10.  
  11. :Opcion1
  12. Echo Has elegido la Opcion 1 & pause & Goto :Select
  13. :Opcion2
  14. Echo Has elegido la Opcion 2 & pause & Goto :Select
  15. :Opcion3
  16. Echo Has elegido la Opcion 3 & pause & Goto :Select
  17. :Opcion4
  18. Echo Has elegido la Opcion 4 & pause & Goto :Select
  19. :Opcion5
  20. Echo Has elegido la Opcion 5 & pause & Goto :Select
  21. :Opcion6
  22. Echo Has elegido la Opcion 6 & pause & Goto :Select
  23. :Opcion7
  24. Echo Has elegido la Opcion 7 & pause & Goto :Select
  25. :Opcion8
  26. Echo Has elegido la Opcion 8 & pause & Goto :Select




Título: Re: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 21 Mayo 2012, 04:45 am
Tengo lo siguiente hecho:
Código
  1. @echo off
  2. :inicio
  3.  
  4.  
  5. set var=    
  6. set /p var=         Ingrese un numero entre el 1 y el 8 :
  7.  
  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.
  9. goto inicio
  10.  
  11. if %var%==1 goto opcion1
  12. if %var%==2 goto opcion2
  13. if %var%==3 goto opcion3
  14. if %var%==4 goto opcion4
  15. if %var%==5 goto opcion5
  16. if %var%==6 goto opcion6
  17. if %var%==7 goto opcion7
  18. if %var%==8 goto opcion8
  19. 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???



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

Código
  1. :menu
  2. cls
  3. echo              1.- Ver datos de autor.
  4. echo              2.- Mirar mensaje.
  5. echo              3.- Salir del programa.
  6. set "opcion="
  7. set /p "opcion= elija a donde desea ir: "
  8. if not defined opcion (goto menu)
  9. if %opcion%==1 (goto :autor)
  10. if %opcion%==2 (goto :mensaje)
  11. if %opcion%==3 (goto :salir)  
  12. goto :menu
  13.  

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.


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 21 Mayo 2012, 05:32 am
Código
  1. set /p var=         Ingrese un numero entre el 1 y el 8 :
  2. 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


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 21 Mayo 2012, 06:16 am
"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..


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 21 Mayo 2012, 06:22 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
  1. if "%opcion%"=="1" (goto :autor)
  2. if "%opcion%"=="2" (goto :mensaje)
  3. 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


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 21 Mayo 2012, 06:35 am
Jeje tienes razon, ahora si queda bien.


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 21 Mayo 2012, 06:40 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


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 21 Mayo 2012, 06:44 am
De que me hablas? no se que habras leido.. yo no puse nada.. jajaja, me voy chauuu


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 21 Mayo 2012, 16:17 pm
De que me hablas? no se que habras leido.. yo no puse nada.. jajaja, me voy chauuu

XDDDDDDD



Título: Re: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 21 Mayo 2012, 18:49 pm
Lo del doble post se me había olvidado: es algo que está siempre en regla en todos los foros...sorry por eso!!!

Código:
set /p "op=Ingrese una opcion: "
Echo "%OP%" | FINDSTR "\<[1-8]\>" Error de seleccion pause >NUL|| (Goto :Select)
Goto :Opcion%OP%

Al hacer lo de las comillas dobles en %OP% me resuelve lo del &, pero no lo de la comilla "

Millón de gracias por las respuestas sociates!!!!!!!!

Igual necesito ponerle un mensaje de error para que el usuario sepa que se está equivocando en ingresar los caracteres.

Por más que intento hacerlo, no lo consigo.

Ayuda, porfa!!!!!!!


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 21 Mayo 2012, 19:21 pm
Lo de que haga el mensaje de error no se como, pero mejore el codigo, anulando lo de la comilla, ahora si no da error nunca, eso espero.

Código
  1. :menu
  2. cls
  3. echo              1.- Ver datos de autor.
  4. echo              2.- Mirar mensaje.
  5. echo              3.- Salir del programa.
  6. set "opcion="
  7. set /p "opcion= Elija a donde desea ir: "
  8. if not defined opcion (goto menu)
  9. if "%opcion:"=%"=="1" (goto :autor)
  10. if "%opcion:"=%"=="2" (goto :mensaje)
  11. if "%opcion:"=%"=="3" (goto :salir)  
  12. goto :menu
  13.  

Hice que verifique el valor de opcion pero sin las comillas. Total todo cuenta como error.

Tal vez haciendo lo de FINDSTR y buscando si existe la comilla ", que muestre el mismo error que cuando no se ingresa los datos correctos, es decir, hacer una captura de esa exepcion en batch, para q antes de hacer los ifs verifique si existe la comilla. Yo no se usar FINDSTR, pero Elektro tal vez lo hace.

Aunque.. para mi, repito, no mostrar ningun mensaje, asi como hace este ultimo codigo que deje, queda mas profesional, pienso yo.


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 21 Mayo 2012, 21:42 pm
Yo creo q lo profesional es mostrar un mensaje de error siempre que el código pueda dar algún error incorregible, En caso contrario, Si es un código perfecto que no puede dar lugar a errores, Pues sin mensaje de error como dice $Edu$

Y con este code de abajo, ya no puede dar error, Pero ahi te dejo para que pongas el mensaje de error a tu gusto:

Código
  1. @echo off
  2.  
  3. :Select
  4. CLS
  5.  
  6. REM Reseteamos el valor de la variable...
  7. Set op=Foro.ElHacker.Net
  8.  
  9. set /p "op=Ingrese una opcion: "
  10.  
  11. REM Reemplacamiento del string. (Le borramos las comillas que contenga la variable. No es necesario hacer esto con el resto de caracteres.)
  12. Set "Op=%OP:^"=%" & REM "
  13.  
  14. REM Esta linea devuelve directamente al menú principal si no se introduce el intervalo de números 1 a 8.
  15. Echo "%OP%" | FINDSTR "\<[1-8]\>" >NUL || (Goto :Select)
  16.  
  17. REM Esta linea manda un mensaje de error si no se introduce el intervalo de números 1 a 8, y devuelve al menú principal.
  18. REM Echo "%OP%" | FINDSTR "\<[1-8]\>" >NUL || (Echo: Tu mensaje de error & Ping -n 4 localhost >NUL & Goto :Select)
  19.  
  20. Goto :Opcion%OP%
  21.  
  22. :Opcion1
  23. Echo Has elegido la Opcion 1 & pause & Goto :Select
  24. :Opcion2
  25. Echo Has elegido la Opcion 2 & pause & Goto :Select
  26. :Opcion3
  27. etc...

Saludos


Título: Re: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 22 Mayo 2012, 03:29 am
Ahora tengo lo siguiente:

Código:
set "var="    
set /p "var=               Ingrese un numero entre el 1 y el 8 : "


 
 if not defined opcion (goto :inicio)

 if "%var:"%"=="1" (goto :alfa)
 if "%var:"%"=="2" (goto :beta)
 if "%var:"%"=="3" (goto :gamma)
 if "%var:"%"=="4" (goto :epsilon)
 if "%var:"%"=="5" (goto :omega)
 if "%var:"%"=="6" (goto :uno)
 if "%var:"%"=="7" (goto :dos)
 if "%var:"%"=="8" (goto :tres)



echo off
:alfa
color 2e
cls
echo...


Todo OK con lo de la validación de errores, pero cuando intento pasar a la opción alfa, por ejemplo, no me dirige hacia ahí.

Cuál esl el drama???


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 22 Mayo 2012, 06:18 am
Código
  1. if "%var:"%"=="1" (goto :alfa)
  2. if "%var:"%"=="2" (goto :beta)
  3. if "%var:"%"=="3" (goto :gamma)
  4. ...

Todo OK con lo de la validación de errores, pero cuando intento pasar a la opción alfa, por ejemplo, no me dirige hacia ahí.

No, Nada está OK. El código que has puesto ahora no da errores porque no está comprobando ninguna variable.
Estás usando mal la syntaxis, Estás escribiendo una comilla doble donde no debe haber comillas, Las comprobaciones no se puede efectuar.

Se te ha explicado como hacerlo, Sobretodo en mi última respuesta.
Si tienes más dudas con este código, Mejor deberias pensar en coger un manual de Batch y empezar a practicar, Porque de verdad que ya has recibido toda la ayuda posible para este problema, Te lo dijimos TODO y te lo dimos todo hecho, Ahi tienes los códigos que funcionan, No hay más misterio.


PD:
Código
  1. :: BAD
  2. if "%var:"%"=="1" (goto :alfa)
  3.  
  4. :: GOOD
  5. if "%var%"=="1" (goto :alfa)

Un saludo.


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 22 Mayo 2012, 16:54 pm
Creo que te has equivocado Elektro, esas comillas era por lo de que no de errores y entonces yo las remplazaba por nada.

El codigo ya lo deje y es este:

Código
  1. :menu
  2. cls
  3. echo              1.- Ver datos de autor.
  4. echo              2.- Mirar mensaje.
  5. echo              3.- Salir del programa.
  6. set "opcion="
  7. set /p "opcion= Elija a donde desea ir: "
  8. if not defined opcion (goto menu)
  9. if "%opcion:"=%"=="1" (goto :autor)
  10. if "%opcion:"=%"=="2" (goto :mensaje)
  11. if "%opcion:"=%"=="3" (goto :salir)  
  12. goto :menu
  13.  
  14.  

Fijate bien lo que copias y no copies a media, mas vale trata de entenderlo y entonces no te equivocaras. No se porque por ejemplo pones un echo off por ahi en tu codigo..


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 22 Mayo 2012, 17:42 pm
Creo que te has equivocado Elektro, esas comillas era por lo de que no de errores y entonces yo las remplazaba por nada.

No, no me habia equivocado, Tú si que estás haciendo bien tu code, Al agregarle el signo del  = estás eliminando temporalmente las comillas para hacer la comprobacion, Pero en el code que he citado no hace eso, No funciona xD, El tuyo sí.

Cita de: Edu
Código
  1. if "%opcion:"=%"=="1" (goto :autor)
Cita de: vivaelpirateo
Código
  1. if "%opcion:"%"=="1" (goto :autor)


Saludos


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 22 Mayo 2012, 17:48 pm
Ahhh no veia bien xDD


Título: Re: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 22 Mayo 2012, 18:35 pm
Mil gracias socitos!!!!

Ahora sí que me pegué la escurrida y me di cuenta del error.


Millón de gracias, mis buenos foreros!!!

 ;-)


Otra consulta:

Cómo la hago para poner más de 9 opciones???

Ya que cuando intento poner 10 ó más, me genera problemas el código:


Código:
set "op=" 
set /p "op=               Ingrese una opcion entre el 1 y el 10 : "

Set "op=%op:^"=%" & REM "

echo "%op%" | FINDSTR "\<[1-9]\>" >NUL || (Goto :beta)

Goto :op%op%

La tengo que dejar en 9 para no tener problemas.


No sé si me responda a mí mismo con esto:

Código:
echo "%op%" | FINDSTR "\<[1-9] || [10] \>" >NUL || (Goto :beta)




Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 23 Mayo 2012, 03:22 am
Cómo la hago para poner más de 9 opciones???
Ya que cuando intento poner 10 ó más, me genera problemas el código:
La tengo que dejar en 9 para no tener problemas.

Es que el intervalo permitido es de 1 caracter, No dos :-/   Así que hay que añadir más intervalos:

Código
  1. @Echo OFF
  2.  
  3. :Usuarios
  4. set "op=empty"
  5. Echo Ingrese una opcion entre el 1 y el 10:
  6. set /p op=^>^>
  7.  
  8. Set "op=%op:^"=%"
  9.  
  10. REM del 1 al 10
  11. Echo "%op%"| FINDSTR "^\"[1-9]\"$ ^\"10\"$" >NUL || (cls & Goto :usuarios)
  12.  
  13. REM Del 1 al 99
  14. REM Echo "%op%"| FINDSTR "^\"[1-9]\"$ ^\"[1-9][0-9]\"$" >NUL || (cls & Goto :usuarios)
  15.  
  16. REM Del 1 al 35
  17. REM Echo "%op%"| FINDSTR "^\"[1-9]\"$ ^\"1[0-9]\"$ ^\"2[0-9]\"$ ^\"3[0-5]\"$" >NUL || (cls & Goto :usuarios)
  18.  
  19. Goto :op%op%

Saludos


Título: Re: [Batch] Se me cae el script
Publicado por: $Edu$ en 23 Mayo 2012, 15:38 pm
O usar mi codigo..


Título: Re: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 4 Junio 2012, 06:25 am
Al presionar una sola vez la tecla espaciadora antes de poner un número, me bota igual es script.

Lo mismo pasa si antes pongo cualquiera de los signos !"#$%&&//())== antes de un número.


Código:
set "var="    
set /p "var=               Ingrese un n£mero entre el 1 y el 8 : "

Set "var=%var:^"=%" & REM "

 echo "%var%" | FINDSTR "\<[1-8]\>" >NUL || (Goto :inicio)

 Goto :var%var%

Ayudaaaaaaaa!!!!!!!!


Título: Re: [Batch] Se me cae el script
Publicado por: Eleкtro en 4 Junio 2012, 09:23 am
deja esto así:

Código
  1. echo "%var%"| FINDSTR "^\"[1-8]\"$" >NUL || (Goto :inicio)

saludos


Título: Re: [Batch] Se me cae el script
Publicado por: VivaElPirateo en 5 Junio 2012, 06:59 am
Mil gracias de nuevo, Elektro HAcker y Edu.

Ahora mi script no se cae y parece más elegante!!!!


Millón de gracias!!!!!!!!!!!