[Batch] Problema al leer múltiples niveles de subdirectorios

Iniciado por z3nth10n, 26 Diciembre 2013, 15:00 PM

0 Miembros y 1 Visitante están viendo este tema.

z3nth10n

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 (dos) [Seleccionar]
::cloc-1.60.exe "C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src\CoherentNoise"
@echo off
::set carpeta="C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"
set archivo=mi_juego.log
For /F "Tokens=*" %%a in ('dir /B /S /A:D "C:\Users\Alvaro\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"') do (
::echo Explorando carpeta "%%a"
echo Carpeta: "%%a" >> "%archivo%"
echo. >> "%archivo%"
cloc-1.60.exe "%%a" >> "%archivo%"
echo. >> "%archivo%"
For /F "Tokens=*" %%b in ('dir /B /S /A:D "%%a"') do (
::echo Explorando carpeta "%%b"
echo Carpeta: "%%b" >> "%archivo%"
echo. >> "%archivo%"
cloc-1.60.exe "%%b" >> "%archivo%"
echo. >> "%archivo%"
For /F "Tokens=*" %%c in ('dir /B /S /A:D "%%b"') do (
::echo Explorando carpeta "%%c"
echo Carpeta: "%%c" >> "%archivo%"
echo. >> "%archivo%"
cloc-1.60.exe "%%c" >> "%archivo%"
echo. >> "%archivo%"
)
)
)
cls
echo Proceso terminado, gracias por usar CLOC.
pause


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. :)

Interesados hablad por Discord.

Eleкtro

#1
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.
Citarset 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::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 (dos) [Seleccionar]
@Echo OFF

Set "WorkingDir=%CD%"
SET "Directory=%UserProfile%\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src"
SET "OutputFile=%WorkingDir%\mi_juego.log"

PUSHD "%Directory%"
(
FOR /D /R %%@ in ("*") DO (

Echo: Carpeta: "%%~@" | MORE
Start /W "Count Lines Of Code" "%WorkingDir%\cloc-1.60.exe" "%%~@"

)

)>"%OutputFile%"
POPD & CLS

Echo: Proceso terminado, gracias por usar CLOC.

Pause & Exit /B 0


Saludos








z3nth10n

#2
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.

Interesados hablad por Discord.

Eleкtro

Cita de: Ikillnukes en 26 Diciembre 2013, 15:37 PMNo 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








z3nth10n

#4
Cita de: ElektroSoft en 26 Diciembre 2013, 15:40 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... :/

Interesados hablad por Discord.

Eleкtro

#5
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 (vb) [Seleccionar]
' Run Hidden Process
' By Elektro H@cker

Process   = """" & WScript.Arguments(0) & """"
Arguments = null

For X = 1 to WScript.Arguments.Count - 1
  Arguments = Arguments & " " & _
              """" & WScript.Arguments(X) & """"
Next

WScript.CreateObject("WScript.Shell").Run _
Process & " " & Arguments, 0, False

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








z3nth10n

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 (dos) [Seleccionar]
@Echo OFF

Set "WorkingDir=%CD%"
SET "Directory=%UserProfile%\Documents\Dropbox2\Dropbox\Game Unity3D\Assets\resources\src\CoherentNoise"
SET "OutputFile=%WorkingDir%\mi_juego.log"

Echo Comenzando a leer. > "%OutputFile%"
Echo. >> "%OutputFile%"
Echo ========================== >> "%OutputFile%"
Echo. >> "%OutputFile%"

PUSHD "%Directory%"
(
FOR /D /R %%@ in ("*") DO (

Echo Carpeta: "%%~@" >> "%OutputFile%"
Echo. >> "%OutputFile%"
"%WorkingDir%\cloc-1.60.exe" "%%~@" >> "%OutputFile%"
Echo. >> "%OutputFile%"
Echo ========================== >> "%OutputFile%"
Echo. >> "%OutputFile%"

)

)
POPD

Echo Proceso terminado, gracias por usar CLOC. >> "%OutputFile%"

CLS

Echo Proceso terminado, gracias por usar CLOC.

Pause & Exit /B 0


Un saludo.

Interesados hablad por Discord.

Eleкtro

#7
Cita de: Ikillnukes en 26 Diciembre 2013, 16:44 PMComo 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!








z3nth10n

Cita de: ElektroSoft en 26 Diciembre 2013, 17:13 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

Interesados hablad por Discord.