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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Batch] Problema al leer múltiples niveles de subdirectorios
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Batch] Problema al leer múltiples niveles de subdirectorios  (Leído 3,709 veces)
z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
[Batch] Problema al leer múltiples niveles de subdirectorios
« en: 26 Diciembre 2013, 15:00 pm »

Hola buenas, Tengo un pequeño problema con Batch....

Estaba investigando una cosa para hacer un minisnippet de un programa que muestra cuantas lineas tiene x source code, y vi un tema http://foro.elhacker.net/scripting/recorrer_directorios_y_generar_log_batch-t332054.0.html

Para recorrer todas las subcarpetas de un directorio y así no tener que estar metiendo todas las subcarpetas a mano...

Así que he hecho 3 ciclo fors, y los problemas son:

- Que el ciclo lo recorre doblemente
- No hay ningún script que lo haga todo mas compacto sin tener que estar haciendo 40 ciclos fors para recorrer 40 subcarpetas?

Código
  1. ::cloc-1.60.exe "C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src\CoherentNoise"
  2. @echo off
  3. ::set carpeta="C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"
  4. set archivo=mi_juego.log
  5. For /F "Tokens=*" %%a in ('dir /B /S /A:D "C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"') do (
  6. ::echo Explorando carpeta "%%a"
  7. echo Carpeta: "%%a" >> "%archivo%"
  8. echo. >> "%archivo%"
  9. cloc-1.60.exe "%%a" >> "%archivo%"
  10. echo. >> "%archivo%"
  11. For /F "Tokens=*" %%b in ('dir /B /S /A:D "%%a"') do (
  12. ::echo Explorando carpeta "%%b"
  13. echo Carpeta: "%%b" >> "%archivo%"
  14. echo. >> "%archivo%"
  15. cloc-1.60.exe "%%b" >> "%archivo%"
  16. echo. >> "%archivo%"
  17. For /F "Tokens=*" %%c in ('dir /B /S /A:D "%%b"') do (
  18. ::echo Explorando carpeta "%%c"
  19. echo Carpeta: "%%c" >> "%archivo%"
  20. echo. >> "%archivo%"
  21. cloc-1.60.exe "%%c" >> "%archivo%"
  22. echo. >> "%archivo%"
  23. )
  24. )
  25. )
  26. cls
  27. echo Proceso terminado, gracias por usar CLOC.

Log generado: http://pastebin.com/tUwkVcA1

Como podéis observar algunas carpetas están duplicadas, es más, con el Sublime Text, pasandole el Sort Unique, me borra la mitad de ese log...

Un saludo.
PD:
Por si sirviese el dato, tengo un W7...

Y feliz navidad. :)


« Última modificación: 26 Diciembre 2013, 15:13 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #1 en: 26 Diciembre 2013, 15:29 pm »

Has adaptado mal el ejemplo que tomaste de mi antiguo usuario "@pitoloko"

1.
Estas usando 3 FOR anidados y la función de los 3 es recorrer subdirectorios, sin permitir que el primer FOR termine de procesar todos los subdirectorios, óbviamente se van a procesar más veces de las deseadas.

2.
Citar
Código:
set carpeta="C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"
En Batch sólamente debes colocar las comillas dobles después del símbolo =, en casos especiales, pero este no es uno de esos casos.

3.
Citar
Código:
::echo Explorando carpeta "%%a"
La mala costumbre técnica de usar un doble operador :: como reemplazamiento de linea de comentario (REM), no se debe usar dentro del bloque de un búcle, por precaución.

Código
  1. @Echo OFF
  2.  
  3. Set "WorkingDir=%CD%"
  4. SET "Directory=%UserProfile%\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"
  5. SET "OutputFile=%WorkingDir%\mi_juego.log"
  6.  
  7. PUSHD "%Directory%"
  8. (
  9. FOR /D /R %%@ in ("*") DO (
  10.  
  11. Echo: Carpeta: "%%~@" | MORE
  12. Start /W "Count Lines Of Code" "%WorkingDir%\cloc-1.60.exe" "%%~@"
  13.  
  14. )
  15.  
  16. )>"%OutputFile%"
  17. POPD & CLS
  18.  
  19. Echo: Proceso terminado, gracias por usar CLOC.
  20.  
  21. Pause & Exit /B 0

Saludos


« Última modificación: 26 Diciembre 2013, 15:39 pm por ElektroSoft » En línea



z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #2 en: 26 Diciembre 2013, 15:37 pm »

El error 2 y 3 me lo vas a tener que disculpar, ya que llevo bastante tiempo sin programar Batch, y pues bueno, si recordaba que me dijiste hace tiempo que no era buena idea usar :: en algún sitio, pero y no lo recordaba...

Y por cierto... No se lo que ha pasado, que cloc-1.60.exe no me lo reconoce, y está en la misma carpeta... :/

Un saludo.
« Última modificación: 26 Diciembre 2013, 15:40 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #3 en: 26 Diciembre 2013, 15:40 pm »

No se lo que ha pasado, que cloc-1.60.exe no me lo reconoce, y está en la misma carpeta... :/

Se debe a que en el código modifico la ruta del directorio de trabajo actual, ya lo he corregido en el código de arriba

Saludos
En línea



z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #4 en: 26 Diciembre 2013, 15:42 pm »

Se debe a que en el código modifico la ruta del directorio de trabajo actual, ya lo he corregido en el código de arriba

Saludos

Era suponible, pero no sabía como arreglarlo... Gracias de nuevo por tu ayuda ElektroSoft :D

PD: Lo que no recuerdo es como arrancar la app en modo oculto (segundo plano), es un poco molesto, ya que la app, tarda unos segundos en calcular todo, y se spamea todo de ventanas de CMD que se ocultan al segundo....

Estoy buscando, pero como siempre no encuentro nada... :/

PD: Usando /MIN pues vale, pero quiero que no se vea ni en el explorador, y eso si que no lo encuentro... :/
« Última modificación: 26 Diciembre 2013, 15:48 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #5 en: 26 Diciembre 2013, 15:56 pm »

Si me permites la pregunta... ¿Porque no haces la aplicación en .NET?.

No entiendo porque motivo pretendes ocultar el proceso explorer.exe (si es que he entendido bien y eso es lo que pretendes hacer, que tampoco lo sé) pero en ese caso puedes usar VBNET/C#, pero Batch no, como tampoco puedes valerte de Batch para ejecutar una instancia de la CMD en modo oculto, aunque si puedes escribir un archivo VBS que ejecute el script bat/cmd en modo oculto o usar algún programa de terceros para convertir el script a executable (oculto), pero como ya te digo ...sabiendo manejar .NET no creo que debas recurrir ni a Batch ni a VBS para la tarea, yo sería lo último que haría xD, no cuesta nada escribir una mini-aplicación en VBNET que haga estas cosas, aún así ...aquí tienes el script para iniciar un script en la CMD en modo oculto:

Run_Hidden.vbs
Código
  1. ' Run Hidden Process
  2. ' By Elektro H@cker
  3.  
  4. Process   = """" & WScript.Arguments(0) & """"
  5. Arguments = null
  6.  
  7. For X = 1 to WScript.Arguments.Count - 1
  8.   Arguments = Arguments & " " & _
  9.               """" & WScript.Arguments(X) & """"
  10. Next
  11.  
  12. WScript.CreateObject("WScript.Shell").Run _
  13. Process & " " & Arguments, 0, False
  14.  
  15. Wscript.Quit

EDITO: Y para ocultar un proceso (las ventanas del explorer) usando Batch, puedes utilizar la aplicación de terceros NirCMD y/o también CMDOW.

Saludos
« Última modificación: 26 Diciembre 2013, 16:02 pm por ElektroSoft » En línea



z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #6 en: 26 Diciembre 2013, 16:44 pm »

Prefiero Batch por lo que ya te he comentado en Skype...

Y he arreglado el problema, lo gracioso aquí, es que no funciona, porque estaba probando con una carpeta que no tenía más subcarpetas... Era solo un archivo lo que contenía....

Es más... Seguramente, si le pongo una carpeta que tenga subcarpetas, pase direactmente a leer las subcarpetas...



Es más, lo acabo de comprobar....

Como puedo solventar este error?

Código
  1. @Echo OFF
  2.  
  3. Set "WorkingDir=%CD%"
  4. SET "Directory=%UserProfile%\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src\CoherentNoise"
  5. SET "OutputFile=%WorkingDir%\mi_juego.log"
  6.  
  7. Echo Comenzando a leer. > "%OutputFile%"
  8. Echo. >> "%OutputFile%"
  9. Echo ========================== >> "%OutputFile%"
  10. Echo. >> "%OutputFile%"
  11.  
  12. PUSHD "%Directory%"
  13. (
  14. FOR /D /R %%@ in ("*") DO (
  15.  
  16. Echo Carpeta: "%%~@" >> "%OutputFile%"
  17. Echo. >> "%OutputFile%"
  18. "%WorkingDir%\cloc-1.60.exe" "%%~@" >> "%OutputFile%"
  19. Echo. >> "%OutputFile%"
  20. Echo ========================== >> "%OutputFile%"
  21. Echo. >> "%OutputFile%"
  22.  
  23. )
  24.  
  25. )
  26.  
  27. Echo Proceso terminado, gracias por usar CLOC. >> "%OutputFile%"
  28.  
  29. CLS
  30.  
  31. Echo Proceso terminado, gracias por usar CLOC.
  32.  
  33. Pause & Exit /B 0

Un saludo.
En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #7 en: 26 Diciembre 2013, 17:13 pm »

Como puedo solventar este error?

No se le puede denominar Error, por pura lógica si utilizas un método para leer subdirectorios en "X" directorio, no esperes que la directorio Root se vaya a procesar... puesto que no es un subdirectorio.

¿Solución?, primero procesas la carpeta de origen, y luego procesas las subcarpetas con el método que has aprendido.

O bien subes un nivel de directorio para que el directorio que deseas procesar, se procese como un subdirectorio más.

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



z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: [Batch] Problema al leer múltiples niveles de subdirectorios
« Respuesta #8 en: 26 Diciembre 2013, 17:47 pm »

¿Solución?, primero procesas la carpeta de origen, y luego procesas las subcarpetas con el método que has aprendido.

Exactamente he hecho eso, pero la cosa, es que no sabía si se podía complementar a PUSHD, pero ya veo que no... :P
En línea


Interesados hablad por Discord.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Batch] Ejecutar multiples procesos
Scripting
EagleOneRaptor 5 7,512 Último mensaje 9 Mayo 2009, 07:08 am
por leogtz
Borrar solo subdirectorios sin saber nombre [Batch]
Scripting
Dany3j 6 7,043 Último mensaje 29 Julio 2011, 03:48 am
por Dany3j
un if con cálculos múltiples[BATCH]
Scripting
trolleoatodos 4 3,335 Último mensaje 21 Agosto 2013, 14:14 pm
por trolleoatodos
[BATCH] Copiar un archivo y pegarlo en todos los subdirectorios
Scripting
Xpolze 9 8,352 Último mensaje 23 Noviembre 2013, 00:12 am
por Almapa
batch para recorrer todos los subdirectorios y renombrar archivos
Scripting
alecam987 1 9,423 Último mensaje 28 Noviembre 2013, 18:07 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines