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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Redirigir el resultado de un comando a una variable ¿Se puede? ¿Cómo? [BATCH]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Redirigir el resultado de un comando a una variable ¿Se puede? ¿Cómo? [BATCH]  (Leído 4,534 veces)
LoqiRex2

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Redirigir el resultado de un comando a una variable ¿Se puede? ¿Cómo? [BATCH]
« en: 16 Noviembre 2014, 15:52 pm »

Buenas, gente. Es la primera vez que posteo algo en este foro así que no sé si lo estoy haciendo en la sección correspondiente y de la manera correcta.

Tengo un problema con un ejercicio de batch para el colegio secundario que estoy cursando:

Tengo un ejercicio donde tengo que condicionar a elegir entre 4 opciones. La primera es listar archivos según un criterio ingresado por el usuario; la segunda es copiar el resultado de la primera opción a un archivo de texto; la tercera es copiar el contenido de ese archivo de texto de la segunda opción a otro archivo de texto y la cuarta opción simplemente quitea el programa.

Como verán, la realización de las opciones que siguen a la primera están obligadas a realizarse ÚNICAMENTE si la primera opción se ha ejecutado antes. Eso no creo que sea un problema, con una variable adicional que cambie de valor una vez que se ejecuta la primera opción.
No obstante, el problema está en la primer opción. Ya tengo la estructura que evalúa la opción y lleva a la subestructura donde se pide que ingrese un nombre y una extensión para buscar archivos con esas características y ya lo he probado, es decir, se devuelve el resultado que busco. Pero ¿cómo hago para que éste resultado se almacene en una variable? ¿Se puede? De poderse, mi idea sería que para la segunda opción solo tendria que poner algo como "echo %resultado% >> archivo.txt"

Puedo hacer eso? si no puedo, qué otra cosa me recomiendan?. Muchísimas gracias!

Esta es la estructura que llevo hasta ahora (tiene declarada unicamente la subestrcutura de la primer opcion)

Código
  1. @echo off
  2. :menu
  3. echo 1) listar archivos segun su criterio
  4. echo 2) la busqueda anterior se almacena en un archivo
  5. echo 3) copiar este archivo dentro del otro archivo de texto ingresado
  6. echo 4) salir
  7. set /p o= Elija su opcion:
  8. if (%o%==1) goto :uno else(
  9. if (%o%==2) and (%x%==1) goto :dos else (
  10. if (%o%==3)  and (%x%==1) goto :tres else(
  11. if (%o%==4) goto :cuatro)))
  12.  
  13. :uno
  14. set /a x=1
  15. set /p nar= Ingrese el nombre del archivo:
  16. set /p exar= Ingrese su extension, si no conoce ecriba un arterisco:
  17. dir /s C:\*%nar%*.%exar% >
  18. cls
  19. goto :menu

 :huh: :huh: :huh:


« Última modificación: 16 Noviembre 2014, 16:31 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Redirigir el resultado de un comando a una variable ¿Se puede? ¿Cómo? [BATCH]
« Respuesta #1 en: 16 Noviembre 2014, 17:15 pm »

Buenas!

Citar
La primera es listar archivos según un criterio ingresado por el usuario

Citar
el problema está en la primer opción, ¿cómo hago para que éste resultado se almacene en una variable? ¿Se puede?

1) Te están pidiendo que listes archivos, no que almacenes el resultado de la búsqueda en una variable,
    sé que intentas ser eficiente pero en Batch no puedes serlo, así que mi consejo es que no hagas más de lo necesario, es decir, aquello que te piden que hagas.

2) Lamentablemente Batch no llega ni a poder calificarse como "lenguaje de programación", y las variables multi-linea no es una característica soportada (de forma natural) en Batch.
    Para crear una variable multilinea debes recurrir a un pequeño Hack, algo que te resultaría bastante engorroso en la situación que te encuentras (Dir + For /F + MultiLine Hack):
Código
  1. @Echo OFF & SetLocal EnableDelayedExpansion
  2.  
  3. :: New Line Hack Start
  4. set NewLine=^
  5.  
  6.  
  7. :: New Line Hack End
  8.  
  9. set "MultiLine=Line1!NewLine!Line2"
  10. set "MultiLine=!MultiLine!!NewLine!Line3"
  11.  
  12. Echo !MultiLine!
  13.  
  14. Pause&Exit

3) Consejo: Utiliza la programación en Inglés, el desarrollo en Castellano, además de feo, no es nada productivo.

Ejemplo:
Código
  1. @Echo OFF
  2.  
  3. :Menu
  4. Echo [1] Perform a file search in drive '%~d0\'.
  5. Echo [2] Write the search result of option [1] to file.
  6. Echo [3] *********
  7. Echo [4] Terminate
  8. Choice.exe /C "1234" /M "Choose an option: "@Echo OFF & SetLocal EnableDelayedExpansion
  9. Cls
  10. Call :Option%ErrorLevel%
  11. Cls
  12. Goto :Menu
  13.  
  14. :Option1 :: Perform file search by pattern.
  15. Set /P "SearchPattern.Filename=Write a partial filename: "
  16. Set /P "SearchPattern.Extension=Write a file extension (or keep it empty for any extension): "
  17.  
  18. Set "SearchPattern.Drive=%~d0"
  19. Set "SearchPattern.Filename=*%SearchPattern.Filename%*"  & :: Fix empty file name.
  20. Set "SearchPattern.Extension=%SearchPattern.Extension%*" & :: Fix empty file extension.
  21.  
  22. (
  23. Dir /A-D /B /S "%SearchPattern.Drive%\%SearchPattern.Filename%.%SearchPattern.Extension%"
  24. )>"%Temp%\SearchResult.tmp"
  25.  
  26. Type "%Temp%\SearchResult.tmp" | MORE
  27. Goto :EOF
  28.  
  29. :Option2 :: Save result to file.
  30. If Not Exist "%Temp%\SearchResult.tmp" (
  31. Echo There is any previous search result to save.
  32. ) Else (
  33. Set /P "FileName=Set the destination filename: "
  34. Call Move /Y "%Temp%\SearchResult.tmp" "%CD%\%%FileName%%.txt"
  35. )
  36. Goto :EOF
  37.  
  38. :Option3
  39. :: Do Something.
  40. Goto :EOF
  41.  
  42. :Option4

Saludos


« Última modificación: 16 Noviembre 2014, 17:23 pm por Eleкtro » En línea

LoqiRex2

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Redirigir el resultado de un comando a una variable ¿Se puede? ¿Cómo? [BATCH]
« Respuesta #2 en: 16 Noviembre 2014, 18:17 pm »

Buenas!

1) Te están pidiendo que listes archivos, no que almacenes el resultado de la búsqueda en una variable,
    sé que intentas ser eficiente pero en Batch no puedes serlo, así que mi consejo es que no hagas más de lo necesario, es decir, aquello que te piden que hagas.

2) Lamentablemente Batch no llega ni a poder calificarse como "lenguaje de programación", y las variables multi-linea no es una característica soportada (de forma natural) en Batch.

3) Entiendo perfectamente esto, pero estoy evaluando el código con unos compañeros y algunos no manejan nada de inglés.


1) Sí, entiendo eso. Lo que pasa es que dentro de mi cabeza no se me ocurría otra posible solución mas que, después de obtener el resultado de la búsqueda, dejarlo almacenado en algún lugar al que pueda recurrir a la hora de realizar la opción 2.

2) Estuve leyendo tiempo después de haber posteado eso y caí en cuenta de eso.

Con el código que me preparó (muy amable de su parte, muchísimas gracias) puedo ejecutar la primer actividad, y al hacer la segunda solicita detallar dónde y con qué nombre va a ir el archivo ¿Verdad? Bueno, pues he ingresado C:\prueba1.txt y en C: no quedó ningún .txt con esa información. Lo más probable es que yo no esté entendiendo el código, porque a mitad de este año he empezado a programar con batch y, por ej., no conozco el comando choice. Hasta ahora, en las clases, solo hemos trabajado con if y de hecho la intención era realizar este ejercicio con if. Pero se me complica mucho (demasiado) la idea de anidarlos tantas veces. Es muy engorroso y es algo que suelo hacer en Pascal (otro lenguaje que estamos utilizando), pero en Pascal cuento con la ayuda de los Begin/end que puedo abrir bastantes veces uno dentro del otro. Aquí la cosa es demasiado engorrosa

Su código me ha servido para entender mejor cómo podría llegar a realizarlo, pero tampoco llego a comprenderlo totalmente. Estoy en un nivel muy inferior, demasiado.

Siguiendo la idea de hacerlo con los ifs (aunque quiero intentar entender al Choice, no me serviría para la clase), he ideado este código. Pero se ingresa a la primer opción y luego cuando ingreso a la segunda, entra nuevamente por la primera. ¿Qué hago?

Código
  1. @echo off
  2. :menu
  3. echo 1) listar archivos segun su criterio
  4. echo 2) la busqueda anterior se almacena en un archivo
  5. echo 3) copiar este archivo dentro del otro archivo de texto ingresado
  6. echo 4) salir
  7. set /p o= Elija su opcion:
  8. if (%o%==1) goto :uno else (if (%o%==2) (goto :if2) else (if (%o%==3) (goto :if3) else (if (%o%==4) (goto :cuatro) else (goto :error))))
  9.  
  10. :uno
  11. del /s C:\artemp1.txt >> c:\artemp2.txt
  12. set /a c=1
  13. set /p nar= Ingrese el nombre del archivo:
  14. set /p exar= Ingrese su extension, si no conoce ecriba un arterisco:
  15. dir /s C:\*%nar%*.%exar% >> c:\artemp1.txt
  16. type c:\artemp1.txt
  17. cls
  18. goto :menu
  19.  
  20. :dos
  21. set /a c=2
  22. set /p noar1= Escriba el nombre del archivo de texto donde se va a guardar:
  23. type c:\artemp1.txt >> c:\%noar%.txt
  24. cls
  25. goto :menu
  26.  
  27. :tres
  28. set /p nombre2= Escriba el nombre del segundo archivo de texto destino:
  29. type C:\%nombre1%.txt >> c:\%nombre2%.txt
  30. cls
  31. goto :menu
  32.  
  33. :cuatro
  34. echo se saldra del programa
  35.  
  36. :error
  37. echo Ingreso algun nro fuera del rango o  intento realizar las opciones 2 y 3 sin hacer primero la 1 o la 2, respectivamente
  38. cls
  39. goto :menu
  40.  
  41. :if2
  42. if (%c%==1) goto :dos else(goto :error)
  43.  
  44. :if3
  45. if (%c%==2) goto :tres else(goto :error)

La idea es que una vez que se ingrese a la primera opción, esta determine el resultado de la búsqueda (según los parámetros ingresados) y los guarde en un archivo temporal (el cual es borrado cada vez que se inicia este bloque :uno). De manera que si por alguna razón quisiera volver a entrar en la opción uno, muestre el resultado de la última búsqueda realizada y no de las anteriores. Ahora, si quisiese ingresar a la segunda opción la idea es que se evalúe si lo elegido es un 2. Si es asi, nos envía a otro bloque donde hay OTRO if el cual determina si se ejecutó o no la primera opción (por medio de una variable "contadora"), si fuese así, nos enviaría al bloque :dos (el cual tiene el bloque por el cual se guarda en un archivo con nombre a gusto del usuario. La tercera opción consiste en copiar el contenido del mismo archivo creado en la dos, a otro archivo,  y la manera de evaluar si se ejecutó la segunda opción ya es la misma que se utilizó en la segunda para determinar si se ejecutó la primera.

No entiendo qué hacer y traté de ser lo más claro posible en la explicación del algoritmo. Nuevamente, soy muy torpe con estas cosas. Es el segundo año que tengo programación y vengo de programar en pascal cosas tontas.


« Última modificación: 16 Noviembre 2014, 21:44 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Redirigir el resultado de un comando a una variable ¿Se puede? ¿Cómo? [BATCH]
« Respuesta #3 en: 16 Noviembre 2014, 22:10 pm »

al hacer la segunda solicita detallar dónde y con qué nombre va a ir el archivo ¿Verdad? Bueno, pues he ingresado C:\prueba1.txt y en C: no quedó ningún .txt con esa información. Lo más probable es que yo no esté entendiendo el código

Lo que ocurre es que en el bloque de la opción [2] pido el nombre del archivo, no pido la ruta completa ni tampoco la extensión, el archivo se guarda con el nombre especificado en el directorio de trabajo actual.

El código que escribí es un sólo ejemplo para orientarte y está abierto a modificaciones para adaptarlo a tus necesidades.





se ingresa a la primer opción y luego cuando ingreso a la segunda, entra nuevamente por la primera.

El problema, obviamente, está aquí:
Citar
Código
  1. if (%o%==1) goto :uno else (if (%o%==2) (goto :if2) else (if (%o%==3) (goto :if3) else (if (%o%==4) (goto :cuatro) else (goto :error))))

Estás intentando simular un 'ElseIf', pero esta es otra característica que no está soportada en Batch (aunque por otro lado si que soporta un 'And', pero de forma invisible).
No es necesario que anides los ifs para conseguirlo.

¿Qué hago?

Tienes tres opciones:

1) usar múltiples If:
Código
  1. If "%o%" EQU "1" (Goto :uno)
  2. If "%o%" EQU "2" (Goto :dos)
  3. etc...

2) Usar el comando Choice como ya mostré.

3) Omitir el uso de If y llamar al método deseado de forma dinámica:

Código
  1. @echo off
  2.  
  3. :menu
  4. cls
  5. echo 1) listar archivos segun su criterio
  6. echo 2) la busqueda anterior se almacena en un archivo
  7. set /p "o= Elija su opcion:"
  8. Call :%o%
  9. Goto :Menu
  10.  
  11. :1
  12. Echo Soy el método 1
  13. goto :EOF
  14.  
  15. :2
  16. Echo Soy el método 2
  17. goto :EOF


saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines