Script para obtener las subcarpetas de las subcarpetas de una carpeta

Iniciado por ‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡, 28 Diciembre 2008, 06:03 AM

0 Miembros y 2 Visitantes están viendo este tema.

‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Hola como están  ;)

Como ustedes saben, Visual Basic Script tiene la opción de devolvernos las subcarpetas que se encuentran en la carpeta que le hayamos indicado.


Código (vb) [Seleccionar]

Ej:
Set fso=CreateObject("Scripting.FileSystemObject")
Set carpI=fso.GetFolder("C:\")
Set carpsSub=carpI.SubFolders

For Each c in carpsSub
msgbox c
Next


Esto nos mostraría:

Carpeta C:
         |__Subcarpetas.


El detalle es que no tiene un metodo (que yo sepa) para devolvernos las subcarpetas de las subcarpetas, es decir:

Carpeta C:
         |___Subcarpetas

                        |_____Subcarpetas
                                          |_____Subcarpetas


El siguiente Script permite obtener todas las subcarpetas, de las subcarpetas, de la carpeta que le hayamos indicado, esto es:

Carpeta Inicial (la que se quiera)
      |
      |____Subcarpeta 1          Subcarpeta 2

                      |                        |
                ___|____                  |___Subcarpetas
                |            |                                 |___etc...
                |__etc...  |_etc...


Funcionamiento:
Primero hace una serie de preguntas para que indiquemos sobre que carpeta querermos obtener sus subcarpetas, ademas de la ruta donde se va a crear un archivo de texto.
Se crea un archivo de texto con el nombre dirs.txt.
En la primera linea el script escribe la ruta de la carpeta inicial que indicamos.
Despues el script va a leer la primera linea y anexará en dicho archivo, las subcarpetas dentro de la carpeta que indicamos.
Asi, el script ira leyendo linea por linea, y tomará cada linea (ruta) como carpeta inicial, anexando al archivo, las subcarpetas contenidas en la ahora carpeta inicial.
Si encuentra mas subcarpetas, las va anexando al archivo; si no encuentra mas en la carpeta inicial actual, no anexa nada y lee la siguiente linea del archivo.
* Una vez terminado el proceso del script, se mandará un mensaje indicandolo. Si se tarda es porque han seleccionado una carpeta con muchas carpetas. Tengan paciencia y esperen a que aparezca el mensaje.

Para que nos puede servir:
Dependiendo de lo que quieran hacer, y con el codigo indicado
Puede funcionar como buscador de carpetas o archivos.
Nos puede permitir obtener todos los archivos (por ej jpg, mpg, etc) dentro de cada subcarpeta, para copiarlos a una carpeta en particular.
Realmente el codigo lo hice para ver si lo podía hacer, pero no pense en alguna utilidad en especifico, asi que espero que les sea util, y cualquier funcionalidad que le encuentren, agradecería que lo comentaran.

Aqui está el código:



Código (vb) [Seleccionar]
Option Explicit
Dim Rutas
Dim oArch, oLArc, oCarI, oCar, objNovCar, oDirTemp
Dim archI, lecArc, carI, LecLin, novCar, subNCar, DirTemp
Dim subsC
Dim BucSkipLine, Conteo
Dim Mensg
Dim InboxA, InboxB
Dim rutCorrect
Dim verArch
Dim ArchFnl


Set oDirTemp=CreateObject("Scripting.FileSystemObject")
Set DirTemp=oDirTemp.GetSpecialFolder(2)

InboxA=inputbox("Indique la ruta del archivo, el cual tendra la lista de carpetas y subcarpetas" & Chr(13) & Chr(13) & "Use el fomato X:\Carpeta." & Chr(13)& "NO la escriba entre comillas", "Ruta del Archivo", DirTemp)


If InboxA="" Then
msgbox "Ha elegido Cancelar o no ha escrito texto alguno." & Chr(13) & Chr(13)& "La aplicación se cerrara."
Else

Set oCar=CreateObject("Scripting.FileSystemObject")

rutCorrect=oCar.FolderExists(InboxA)

          If rutCorrect=False Then
          msgbox "La ruta indicada NO existe"
          Else

          Mensg=msgbox("Seleccione una de las siguientes opciones:" & Chr(13) & Chr(13) & "Seleccione SI, si quiere que la carpeta inicial sea C:\" & Chr(13) & "Esto incluiria cada carpeta y subcarpetas dentro de C:\" & Chr(13) & "NOTA: Dependiendo de cuantas carpetas tenga su sistema," & Chr(13) & "esto podria tomar varios minutos"& Chr(13) & Chr(13) & "Seleccione NO, si desea seleccionar una ruta en particular" & Chr(13) & Chr(13) & "Seleccione CANCELAR para terminar el programa", 323, "SELECCIONE LA CARPETA INICIAL")

                    If Mensg=6 Then

                    InboxB="C:\"
                    Directs

                    Else

                             If Mensg=7 Then
                             InboxB=inputbox("Indique la ruta del archivo, el cual tendra la lista de carpetas y subcarpetas" & Chr(13) & Chr(13) & "Use el fomato X:\Carpeta." & Chr(13)& "NO la escriba entre comillas" & Chr(13) & Chr(13) & "Recuerde que puede incluir C:\", "Ruta del Archivo", DirTemp)


                                      If InboxB="" Then
                                      msgbox "Ha elegido Cancelar o no ha escrito texto alguno." & Chr(13) & Chr(13) & "La aplicación se cerrara."
                                      Else

                                      rutCorrect=oCar.FolderExists(InboxB)

                                                  If rutCorrect=False Then
                                                  msgbox "La ruta indicada NO existe"
                                                  Else
                                                  Directs

                                                  End If

                                      End If

                             End If

                    End If

          End If

End If

Private Sub Directs()
Set ArchFnl=CreateObject("WScript.Shell")

InboxA=InboxA & "\dirs.txt"
Rutas=array(InboxA, InboxB)

Set oArch=CreateObject("Scripting.FileSystemObject")
Set archI=oArch.CreateTextFile(Rutas(0), True)

Set carI=oCar.GetFolder(Rutas(1))
archI.WriteLine(carI)
archI.Close


Set oLArc=CreateObject("Scripting.FileSystemObject")
Set lecArc=oLArc.OpenTextFile(Rutas(0), 1)
Set objNovCar=CreateObject("Scripting.FileSystemObject")

Conteo=1

Do While lecArc.AtEndOfStream=False

     On Error Resume Next

     LecLin=lecArc.ReadLine
     lecArc.Close

     Set novCar=objNovCar.GetFolder(LecLin)
     Set subNCar=novCar.SubFolders

          For Each subsC in subNCar
          Set lecArc=oLArc.OpenTextFile(Rutas(0), 8)
          lecArc.WriteLine (subsC)
          lecArc.Close
          Next

     Set lecArc=oLArc.OpenTextFile(Rutas(0), 1)

          For BucSkipLine=1 to Conteo
          lecArc.SkipLine
          Next

     Conteo=Conteo+1
Loop

verArch=msgbox ("Ha terminado el proceso" & Chr(13) & Chr(13) & "El archivo creado esta en" & Chr(13) & Chr(13) & InboxA,,"Archivo de directorios")

End Sub



Comentarios:
El script funciona aunque no se tengan privilegios de administrador.

Detalles/Errores:
(* UNICAMENTE SI LA CARPETA QUE INDICARON CONTIENE LA DE ADMINISTRADOR O USUARIO TIPO ADMINISTRADOR)
Si la carpeta inicial contiene las carpetas de un usuario administrador, teniendo contraseña en tal, y lo ejecutaran en un usuario que no sea del tipo administrador,, o si lo ejecutaran en un usuario tipo administrador, pero en el usuario Administrador (el que sale cuando presionamos la tecla F8 -> modo seguro) y este tuviera contraseña, se generaría un error de tipo Acceso denegado y se terminaría el script antes de haber acabado su proceso.

Por tal motivo agregué la linea On Error Resume Next, lo que hace al Script totalmente funcional, con un pequeño detalle:
Al generarse el error, va dejando lineas en blanco, dentro del archivo, que corresponden a las carpetas que no nos permite acceder.
Este detalle es insignificante y no afecta en la obtencion de las subcarpetas (a las que tengamos acceso, que son la mayoría, incluyendo Windows, System32, Archivos de programa, etc).
De todos modos quise comentarselos, porque si les sirve y le agregan codigo, y su codigo tiene un error, este no se mostraría.


Dudas:

Un favor: he buscado y buscado, y buscado y buscado, información acerca de manipulación de errores en VB en general, y no he encontrado nada, y lo que he encontrado no le he entendido lo suficiente para aplicarlo.

Por ejemplo en este script, agregue if err.Number=x (el de tipo acceso denegado) then, etc... y los tres primeros errores de ese tipo, los podía manipular, pero al cuarto error me volvio a saltar Acceso Denegado.

Alguien conoce una pagina, una liga, o sobre todo si tienen un tutorial, donde se pueda conocer cada tipo de error, su numero, y como manipularlo?


Por otro lado, les quiero pedir que lean el post en http://foro.elhacker.net/dudas_generales/que_lenguajes_recomiendan_para_hacer_programas_de_hacking-t239873.0.html. Quien mejor que programadores para que me puedan ayudar a resolver tal duda.
Es referente a que lenguajes me recomiendan para hacer programas de hacking, tanto que se pueda programar en Windows y Linux al mismo tiempo, y que pueda funcionar tanto en Windows y en Linux.


Pues despues de tanto rollo, me despido y espero que le encuentren buena utilidad al script.

Un saludo a todos
  :laugh:

kraszic

Esta muy bien el code, siempre es bueno intentar hacer cosas y ver q te salgan.

Bueno, aqui dejo yo mi code en batch que creo que es mas facil que el anterior. Tiene la opcion de mostrar archivos y carpetas.

Código (dos) [Seleccionar]

@echo off

title Directorios

set nom=directorys
:menu
cls
echo ------- DIRECTORIOS
echo.
echo.
echo Con este script creara un archivo de texto plano con todas las subcarpetas y archivos dentro de la carpeta que quiera.
echo.
echo.
echo Introduzca la carpeta (sin comillas):
set /p dir=">> "
if not exist "%dir%" (cls & echo No existe el directorio introducido. & echo Pulse cualquier tecla para volver al menu & pause>nul & goto menu)
cls
echo Desea mostrar archivos tambien?
echo.
echo.
echo 1- Si, archivos y carpetas
echo 2- No, solo carpetas
echo.
echo.
echo.
set /p num=Introduzca un numero:
if %num%==1 (set var=/R & set var1=archivos)
if %num%==2 (set var=/R /D & set var1=carpetas)
echo.
echo.
echo Espere a que el archivo sea creado.

cd "%dir%"
echo Lista de %var1% en "%dir%" > %nom%.txt
echo. >> %nom%.txt
echo. >> %nom%.txt
FOR %var% %%i in (*) DO (echo %%i >> %nom%.txt)
cls
echo El archivo ha sido creado.
start %nom%.txt
echo.
echo.
echo.
echo Pulse cualquier tecla para cerrar el programa.
pause>nul
exit


Alomejor ves, el code un poco largo pero me gusta que quede completo.
En batch, el code se resume a esto:

FOR /R %%i in (*) DO echo %%i
(para mostrar archivos)

FOR /r /d %%i in (*) DO echo %%i
(para mostrar carpetas)

saludos

‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

kraszic se ve bueno el code, ademas de sencillo  :)

La verdad es que a batch no le termino de entender   :huh:  >:( :(
Por ejemplo, el FOR /R y FOR /r /d, no se para que se usan. Pero bueno, seguimos en el aprendizaje de la programación y a batch le tendré que dedicar mas rato.

Gracias por el aporte, man.

Un saludo  :)

Novlucker

Buen trabajo BlaKore_Alpha

Aquí un par de scripts que hacen lo mismo, pero con un par de problemas (uno de ellos sin razón alguna)  :¬¬ , en ambos me he salteado la parte de pedir los datos al usuario y he pasado directamente a generar el listado  :P

Código (vb) [Seleccionar]
Set objfso = Createobject("Scripting.filesystemobject")
Set objshell = Createobject("Wscript.shell")

IDir = "C:\"
objshell.run "cmd /c " & """" & IDir & """ /S /B /A:D > RegFile.txt", vbhide, True
Set IReg = objfso.opentextfile("RegFile.txt",1)

Do until IReg.atendofstream
Ruta = IReg.readline
Loop


El "problema" de este son los caracteres con los que ms-dos tiene problemas, como ser "ú" ... ej: "C:\Documents and Settings\Novlucker\Mis documentos\Mi m£sica"

Por lo que sería necesario aplicar algún tipo de filtro a estos caracteres, sería cuestión de un simple replace  :P
Ahora el otro ...

Código (vb) [Seleccionar]
On Error Resume Next
Set objfso = createobject("scripting.filesystemobject")
Set RegFile = objfso.createtextfile("RegFile.txt",True)
Set IDir = objfso.getfolder("c:\")

ListDirs(IDir)

Function ListDirs(IFol)

Regfile.writeline IFol.path
Set SubsIFol = IFol.subfolders

For each SF in SubsIFol
   ListDirs(SF)
Next

End Function


En este caso por alguna extraña razón, en el caso de elegir el directorio raíz da error  de "Acceso denegado" cuando llega a la carpeta Windows, por lo que no se puede acceder a esta carpeta, lo extraño es que si pasamos la carpeta win como parámetro inicial si funciona, es decir, NO puede ser por permisos de usuario  :-\ , así que en algún momento voy a revisarlo a ver que ocurre.

A pesar de estos problemas, estos scripts tienen la ventaja de ser algo más rápidos que el que has creado  :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Antes que nada, gracias por el tiempo dedicado en leer el post.  :laugh:

Que bueno que les haya agradado, y ojala les pueda servir de algo.  ;D

Seguimos en contacto.
Un saludo.

P.D. Novlucker, checaste que use el tip que me comentaste de:
For var=1 to 5
x.SkipLine
Next

En la ejecución del script hubiera aumentado el tiempo de forma notoria, como lo pensaba hacer en un inicio.

‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Buenas amigos:

Novlucker, una duda:
Los codes funcionan juntos o separados?
Algo he de estar haciendo mal, porque si ejecuto el primer code independiente, solo crea el archivo de texto, pero sin texto.
Y si ejecuto el 2do independiente, crea el archivo, pero se queda hasta C:\Archivos de programa\WindowsUpdate

Bueno, solo es un comentario. Ya si lo requiriera, te volvería a consultar...

Un saludo.

Novlucker

Son independientes, el primero lo he modificado, ya que había dejado creada la variable IDir, pero la creaba luego de llamarla  :xD

Y el segundo a mi me va hasta la carpeta windows, por problemas con los permisos supuestamente  :¬¬ , así que quita el On error resume next y prueba nuevamente a ver donde te sale el error  :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Novlucker:

Pues le quite On Error Resume Next, y efectivamente el problema es de acceso.
En mi pc, se queda en C:\Archivos de programa\WindowsUpdate y luego manda el mensaje de error.

Pero bueno, supongo que este tipo de scripts tienen ese detalle de privilegios, verdad?

Lo importante es aportar...
No pense que se pudieran aplicar funciones en un vbscript, ademas de que las funciones me cuestan un poco de trabajo entender, pero ya aprendí algo nuevo  ;).

Pues seguimos en contacto  :).

Un saludo a todos.

Novlucker

Si, pero como he dicho, lo de los permisos es extraño, intenta cambiando el valor de IDir con la ruta de la carpeta donde tienes problemas (C:\Archivos de programa\WindowsUpdate), y verás como lista las subcarpetas  :(
En definitiva, no puede ser que de problema de privilegios y que poniendo la carpeta directamente permita hacerlo  :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Novlucker

Yo otra vez  :P

Mirando un poco más detenidamente tu code he visto que declaras muchas veces el objeto Scripting.filesystemobject, y con varios nombres distintos (oCar, oLArc, oArch, etc), pero esto no es necesario, ya que de este modo creas una instancia de este objeto por cada nombre, sin embargo con que lo hagas una sola vez en todo el code ya es suficiente  ;)

Por otro lado, ahora si, he modificado mi code y lista todos los directorios en más o menos un segundo  ::)

Código (vb) [Seleccionar]
Set objfso = createobject("scripting.filesystemobject")
Set RegFile = objfso.createtextfile("RegFile.txt",True)
Set IDir = objfso.getfolder("c:\")

ListDirs(IDir)

Function ListDirs(IFol)

Regfile.writeline IFol.path
Set SubsIFol = IFol.subfolders

On error resume next
For each SF in SubsIFol
   ListDirs(SF)
Next

End Function

Msgbox "Proceso Terminado"


Diferencia con el anterior, solo he cambiado de lugar el "On error resume next"  :¬¬

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein