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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Recursividad en batch
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recursividad en batch  (Leído 5,228 veces)
Slikp

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Recursividad en batch
« en: 20 Diciembre 2013, 00:11 am »

- Buenas quisiera pedirles ayuda con varias dudas que tengo ya que nunca programe en si y por simple curiosidad inicie con batch y he estado practicando o mejor dicho experimentando, en primer lugar no se si sea la forma correcta de llamarlo (recursividad) a lo que tengo en mente pero antes de preguntar sobre lo de la recursividad por favor espero me aclaren esta duda ya que para lo de la recursividad necesito entender esto que aun no logro decifrarlo y me da mucha curiosidad porque no siento que lo que hice sea muy efeciente que digamos.

- Les muestro lo que hice

Código
  1.  
  2.  @Echo OFF
  3. color 0a
  4.   set /p Ename=                 ¿ Este Equipo Sera Asignado a ?:
  5. cls
  6.        MODE CON cols=90 lines=40
  7.  
  8. echo  +-------------------------Departamento Asignado?-----------------------------------+
  9. echo  +----------------------------------------------------------------------------------+
  10. echo  + 1- Alta Tension T     + 2- Automatizacion     + 3- Part 11     + 4- Bare 1o      +
  11. echo  +----------------------------------------------------------------------------------+
  12. echo  + 5- Biblioteca Tecnica + 6-Bariven (Canp Ter)  + 7- C.A.I       + 8-C.C.A         +
  13. echo  +----------------------------------------------------------------------------------+
  14. echo  +----------------------------------------------------------------------------------+
  15.  
  16.  
  17. set /p Ubicacion=           Seleccione La Ubicacion O Departamento De Este Equipo (Ingrese Un Numero):
  18.  
  19.  
  20. if %Ubicacion%==1 goto 1
  21. if %Ubicacion%==2 goto 2
  22. if %Ubicacion%==3 goto 3
  23.  
  24. :1
  25.  
  26. echo Tu Respuesta Es %Ename%
  27. echo Tu Otra Respuesta Es Alta Tension T
  28.  
  29. :2
  30.  
  31. echo Tu Respuesta Es %Ename%
  32. echo Tu Otra Respuesta Es Automatizacion
  33.  
  34. :3
  35.  
  36. echo Tu Respuesta Es %Ename%
  37. echo Tu Otra Respuesta Es Part 11
  38.  
  39.    Exit
  40.  

- Ok con esos 3 Goto se entiende el Proceso y con eso llegan las Dudas.

      Duda #1.  En realidad bajo el script que estoy Trabajando hay 45 Opciones por lo tanto tendria que realizar 45 Goto con 45 codigo similares porque practicamente todos los Goto son lo mismo con execcion del segundo Echo de cada Goto.

- Hay alguna forma de simplificar el codigo? Pense en los If Else pero basicamente tendria que hacer 40 y tantos Else... Por otro lado se me ocurrio otra idea aunque no se como hacerlo y tampoco se si se podra hacer así ya que lei sobre los Arreglos o Arrays pero no en batch si no en C, Sera que hay alguna manera de definir un Arreglo de 45 x 45 como una constante donde esten ya definidos las 45 opciones y capturar el numero de la opcion y mediante un For recorrer el arreglo y donde la posicion Y coinsida con el numero X capturado y se Imprima lo que este en este arreglo?

     Duda #2. Aqui es lo de la recusividad, hay alguna forma de mostrarle al usuario lo que hizo de manera que el compruebe lo que el mismo hizo y preguntar si es correcto o no y en caso de no ser correcto, volver denuevo al principio de todo el proceso y comenzar? y en caso de ser correcto todo continuar?

- En C segun lo que lei se puede hacer "Creo" mediante Funciones donde si no es correcto la recursividad te retorna nuevamente a la funcion principal y la si es correcta te permite continuar con los demas procesos de la funcion.

- Bueno por ahora eso, espero puedan aclararme esas dudas o si tienen una mejor forma de hacerlo pues bienvenida sea, pero segun mi logica eso es lo que se ocurre hacer.


« Última modificación: 20 Diciembre 2013, 04:38 am por ElektroSoft » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Recursividad en batch
« Respuesta #1 en: 20 Diciembre 2013, 05:43 am »

todos los Goto son lo mismo con execcion del segundo Echo de cada Goto.

- Hay alguna forma de simplificar el codigo?

Este consejo es válido para cualquier lenguaje:
Si necesitas repetir código ...símplemente no lo hagas, evítalo, escribe un método para llamarlo las veces que necesites.
Repetir código es feo, muy feo, aunque la forma de simplificar código repetitivo en Batch tambien es igual de fea.

Sera que hay alguna manera de definir un Arreglo de 45 x 45 como una constante donde esten ya definidos las 45 opciones

¿Arrays en Batch? ...chorradas, creo que sigues sin ser consciente del 'lenguaje' tan simple que es Batch, no busques donde no hay.
Se puede llegar a simular un Array, pero nada más, es tontería seguir pensando en ello.

Citar
Duda #2. Aqui es lo de la recusividad (...) preguntar si es correcto o no y en caso de no ser correcto, volver denuevo al principio de todo el proceso y comenzar?
En C (...) mediante Funciones donde si no es correcto la recursividad te retorna nuevamente a la funcion principal

No es necesario usar métodos recursivos para escribir código eficiente, además la recursividad no es algo bueno y se debe evitar siempre que sea posible, desde luego no es algo de lo que haya que abusar, aunque en Batch puede llegar a ser una pesadilla codear sin generar más recursividad de la que reálmente es necesaria ...así que tampoco importa mucho si hablamos de ese 'lenguaje' en particular, pero por otro lado algo que comparten todos los lenguajes es un límite de llamadas recursivas que puede provocar un error de desbordamiento (Overflow), ¿por ejemplo dices en C/C++ escribir una función que te mande a otro método sin terminar las instrucciones del bloque y por ende sin devolver un valor específico?, no hagas ni caso de las personas que "programen" así en otros lenguajes, por Dios.



Aquí tienes una forma de simplificar el código principal:

Código
  1. @Echo OFF & Setlocal EnableDelayedExpansion
  2.  
  3.  
  4. Set "Answers=Alta Tension T;Automatizacion;Part 11"
  5. Set "Answer =" & REM aquí allmacenaré el "EName" seleccionado.
  6.  
  7.  
  8. :SetAnswer
  9. CLS
  10. Choice.exe /C "123" /M "Seleccione La Ubicacion O Departamento De Este Equipo (Ingrese Un Numero): "
  11. Call :GetAnswer "%ErrorLevel%"
  12.  
  13.  
  14. :GetAnswer
  15. Set /A "UserChoose=%~1"
  16. Set /A "AnswerCount=0"
  17.  
  18. Echo: Tu Respuesta Es '%UserChoose%'
  19.  
  20. For %%# in (%Answers: =[-_-]%) Do (
  21. Set /A "AnswerCount+=1"
  22. If !AnswerCount! EQU %UserChoose% (
  23. Set "Answer=%%#"
  24. Set "Answer=!Answer:[-_-]= !"
  25. Echo: Tu Otra Respuesta Es '!Answer!'
  26. Goto :EOF
  27. )
  28. )
  29. Goto :OnError
  30.  
  31.  
  32. Echo+ | MORE
  33. Choice.exe /M "Son correctos los datos?"
  34. If %ErrorLevel% EQU 2 (
  35. Goto :SetAnswer
  36. ) Else (
  37. Goto :Continue
  38. )
  39.  
  40.  
  41. :OnError
  42. Echo: [ERROR] No se ha encontrado la respuesta '%UserChoose%'
  43. Pause&Exit
  44.  
  45.  
  46. :Continue
  47. REM Escribir código de continuación aquí...
  48. Pause&Exit

Saludos


« Última modificación: 20 Diciembre 2013, 06:02 am por ElektroSoft » En línea

Slikp

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Recursividad en batch
« Respuesta #2 en: 21 Diciembre 2013, 00:42 am »

- Buenas ElektroSoft, te comento que probe tu script y tuve problemas con el Choice ya que no se reconocia como comando interno o externo, luego de indagar un poco di con la solucion en Xp ese comando no existe y segun fue reemplazado por Set /p, Sin embargo pude descargarlo y todo bien.

- Dicho eso quiero comentarte que tuve que cambiar en tu script el /M ya que me generaba errores y luego de buscar y buscar me di cuenta que era el /M y segun la documentacion de Choice /M no exite asi que los /M en tu script los reemplaze por /N, no se si es correcto lo que hice pero me funciono y sin ninguna complicacion ni error alguno al ejecutar las distintas instrucciones, por otro lado recuerdas que dije bajo el script que estoy trabajando tengo 45 opciones?

- Por lo que vi con choise solo puedo tener 10 opciones comenzando por el 0, pero si quiero marcar la opcion 11? como lo haria? ya que no puedo marcar 11 porque a penas tecleo UNO "1" se procesa la orden... Y tengo otra duda pero sera en otra ocasion espero puedas ayudarme con esto y Gracias de ante mano.
« Última modificación: 21 Diciembre 2013, 00:47 am por Slikp » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Recursividad en batch
« Respuesta #3 en: 21 Diciembre 2013, 09:39 am »

El comando choice en Windows XP, existe, en tu caso no se encontraba donde debería estar (quizás estés usando un Windows XP Lite, u otro motivo) pero por defecto viene incluido, y efectívamente la sintaxis del comando difiere de una version de Windows a otra, pero eso tiene facil solución, accediendo a la ayuda dle comando en tu versión de windows...

Código:
Choice /?

Como opciones del comando choice puedes usar valores numéricos desde el 0 hasta el 9, como valores alfabéticos desde la A a la Z, incluyendo caracteres de habla hispana como la ñ y la Ç trencada, áéíóú, àèìòù, así como äëïöü, lo que en total da posibilidad a más que 45 opciones.

Código
  1. Choice.exe /C "¤€µ‚¡¢£…Š•—„‰‹”" /M "Selecciona una opcion"



No es un comando perfecto, no puedes usar "11", "12", !3", etc, esto es Batch.

Si prefieres hacerlo usando el comando Set /P para que todas las opciones sean numéricas, puedes hacerlo perféctamente, solo tienes que reemplazar el comando choice por Set /P, y reemplazar la variable ErrorLevel que uso cuando llamo a la función Getanswer, por la variable establecida por el comando Set /P.

Saludos
« Última modificación: 21 Diciembre 2013, 09:41 am por ElektroSoft » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Recursividad en batch
« Respuesta #4 en: 21 Diciembre 2013, 21:42 pm »

Gracias a vosotros, me vino la idea de llamar programas desde consola, cosa q aun nunca había hecho jaja
En línea

Slikp

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Recursividad en batch
« Respuesta #5 en: 22 Diciembre 2013, 03:20 am »

- Gracias por la ayuda que me has brindado ElektroSoft, Te comento que hice los cambios que me sugeristes pero surgio otro error y con mis pocos conocimientos no e podido dar con la solucion.

- En primer lugar hice respectivamente el cambio que me planteastes, pero al Set /p le pase el ErrorLevel Para asi no cambiar las demas variables ErrorLeval que ya estaban.

Citar
set /p Ename=                 ¿ Este Equipo Sera Asignado a ?:
cls

        MODE CON cols=150 lines=40

echo:
 Setlocal EnableDelayedExpansion
     Set "Answers=Alta Tension T;Automatizacion;Bare 11;Bare 1o;Bariven San Tome;Biblioteca Tecnica;C.A.I;C.C.A;Cad;Sun Rant;Mart Trunt;"
     Set "Answer =" & REM aquí almacena La Respuesta.
:SetAnswer

echo  +-------------------------Departamento Asignado?-------------------------------+
echo  +-------------------------------------------------------------------------------------+
echo  + 1- Alta Tension T     + 2- Automatizacion     + 3- Part 11     + 4- Bare 1o +
echo  +-------------------------------------------------------------------------------------+
echo  + 5- Biblioteca Tecnica+ 6-Bariven (Canp Ter)+ 7- C.A.I        + 8-C.C.A---+
echo  +-------------------------------------------------------------------------------------+
echo  + 10- Cad---------------+11- Sun Rant----------+-12- Mart Trunt--------------+
 
          
   Set /p ErrorLevel=                       Seleccione La Ubicacion O Departamento De Este Equipo (Ingrese Un Numero):
    Call :GetAnswer "%ErrorLevel%"
    Goto :Verify
    
    
    :GetAnswer
    Set /A "UserChoose=%~1"
    Set /A "AnswerCount=0"
    
    Echo+
    Echo                                              El Equipo Sera Asignado a: %Ename%
    Echo:                                             Numero Seleccionado %UserChoose%
    
    For %%# in (%Answers: =[-_-]%) Do (
    Set /A "AnswerCount+=1"
    If !AnswerCount! EQU %UserChoose% (
    Set "Answer=%%#"
    Set "Answer=!Answer:[-_-]= !"
    Echo:                                             Departamento Asignado: !Answer!
    Goto :EOF
    )
    )
    Goto :OnError
    
    
    :Verify
    Echo+ | MORE
    choice.exe /M "                                                        Son correctos los datos Y o N? "
    If %ErrorLevel% EQU 2 (
        cls
    Goto :SetAnswer
    ) Else (
    Goto :Continue
    )
    
    
    :OnError
    Echo: [ERROR] No se ha encontrado la respuesta '%UserChoose%'
    Pause&Exit
    
 REM Escribir código de continuación aquí...  
    :Continue
   
    Echo !...Continuacion del Programa...!
Pause&Exit


- Entonces en teoria todo deberia de funcionar bien ya que no es necesario cambiar el Otro Choice porque obviamente sirve para capturar cualquiera de las 2 opciones S/N pero al pareser algo esta mal ya que al llegar a la pregunta " Son correctos los datos Y o N? " Al teclear cualquiera me genera un error y se cierra el programa, intente cambiar esas lineas por esto.

Citar
:Verify
    Echo+ | MORE
Set /p comprueba=                                             Son correctos los datos Y o N?:
    If %comprueba%==n  Goto :SetAnswer
    If %comprueba%==s  Goto :Continue

- Y solo la opcion "n" me funciono pero la "s" a veces me dice acceso denegado y se termina el programa o en ocasiones me dice no se encontro el valor "X" donde "X" asumo yo que es ErrorLevel... E intente otras cosas pero sin exito, Que podria estar pasando?.
« Última modificación: 22 Diciembre 2013, 03:23 am por Slikp » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Recursividad en batch
« Respuesta #6 en: 22 Diciembre 2013, 12:02 pm »

Citar
Código:
   Set /p ErrorLevel=                       Seleccione La Ubicacion O Departamento De Este Equipo (Ingrese Un Numero):

    choice.exe /M "                                                        Son correctos los datos Y o N? "
    If %ErrorLevel% EQU 2 ...

La integridad del código está complétamente mal.

1. El mensaje del comando Set /P debes encerrarlo entre comillas dobles como en el ejemplo que te puse (Para evitar en el futuro posibles errores/fallos humanos con caracteres ilegales, como los parentesis que lleva tu mensaje).

2. La variable %ErrorLevel% es una variable dinámica que devuelve el código de salida del último comando procesado, pero tu la estas reemplazando por una variable local que se llama exáctamente igual,
por ese motivo la pregunta booleana del comando Choice no te va a devolver un código de salida (1/2), te va a devolver el valor numérico que usaste para definir tu propia variable ErrorLevel en el comando Set /P.

Por algo te dije que debias reemplazar dicha variable.
Para solucionarlo símplemente vuelve a seguir los pasos que te indiqué ...pero esta vez hazlo al pie de la letra, crea una variable con un nombre distinto para usar en el comando SET /P y usa ese mismo nombre de variable como parámetro de la función "GetAnswer", y así el otro Choice [Y/N] te funcionará con la variable %ErrorLevel% corriente.

Saludos!
« Última modificación: 22 Diciembre 2013, 12:12 pm por ElektroSoft » En línea

Slikp

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Recursividad en batch
« Respuesta #7 en: 23 Diciembre 2013, 01:55 am »

- Muchas Gracias ElektroSoft ahora entiendo, en cuanto pueda pruebo y te comento... Por otra parte quisiera preguntarte si se puede hacer lo siguiente, claro hay otras formas de hacerlo (No mediante la programacion), pero por ahora necesito hacer lo siguiente seguro pensaras que me gusta complicarme la vida jaja.

- Bueno el caso es que tengo una carpeta con una Aplicacion "X" y en mi pendriver tengo un archivo que abre con dicha aplicacion, lo que pasa es que cada vez que ejecuto el archivo se abre la tipica ventana de Abrir Con y debo examinar en busca de la Aplicacion "X" para poder abrir el archivo correctamente, esto sucede por que no tengo la Aplicacion instalada y por ese motivo cada vez que intento abrir el archivo desde cualquier lugar debo especificarle con que aplicacion debe abrirse.

- Me podrias mostrar una manera en Batch para que el archivo abrar con la aplicacion directamente sin tener que pasar por el proceso de la ventana Abrir Con y examinar en busqueda del ejecutable de la aplicacion?.
« Última modificación: 23 Diciembre 2013, 01:56 am por Slikp » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Recursividad en batch
« Respuesta #8 en: 23 Diciembre 2013, 05:45 am »

esto sucede por que no tengo la Aplicacion instalada y por ese motivo cada vez que intento abrir el archivo desde cualquier lugar debo especificarle con que aplicacion debe abrirse.

Exacto, al no tener la aplicación instalada, no existe ninguna asociación establecida para ese tipo de archivo específico que intentas abrir...

Si tu escribes este comando:
Código
  1. Start /B "" "Archivo.elek"

...Sin tener la aplicación asociada que pueda abrir archivos con extensión "elek", la shell no va a saber que hacer ...mas que preguntarte por la aplicación en cuestión.

Tienes dos soluciones:

1. Especificar el programa al usar el comando Start, y pasarle el archivo como parámetro:

Código
  1. Start /B "Título cualquiera" "\..\Ruta del pendrive\Programa.exe" "\..\Ruta del Archivo.elek"

\..\ equivale al directorio Root de la ubicación actual desde la que se ejecuta el Script (Ejemplo: "C:\"), así que no deberías tener problemas para localizar los archivos necesarios.

2. Crear una asociación para ese tipo de archivo, en este caso "elek".

Código
  1. Assoc ".elek"="ElektroSoft"
  2. Ftype "ElektroSoft"=".\Notepad.exe"
  3. REM O bien con soporte para recibir parámetros:
  4. REM Ftype "ElektroSoft"=".\Notepad.exe" "%%1" %%*

Código
  1. Start /B "" "Archivo.elek"

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recursividad
Java
rjrn 8 9,793 Último mensaje 17 Marzo 2009, 19:33 pm
por weirdtyping
recursividad
Ejercicios
Choclito 0 3,573 Último mensaje 12 Mayo 2009, 04:47 am
por Choclito
Recursividad
Programación C/C++
Abanda_9 4 4,905 Último mensaje 29 Mayo 2010, 04:09 am
por Abanda_9
[Batch] Insertar un batch dentro de un batch que fabrique un .txt
Scripting
$pedrojo2704 2 5,559 Último mensaje 23 Agosto 2012, 10:08 am
por $pedrojo2704
[BATCH] Duda sobre recursividad en directorio y permisos de usuarios
Scripting
Aeros 3 2,925 Último mensaje 5 Marzo 2015, 16:00 pm
por Aeros
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines