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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Script para obtener las subcarpetas de las subcarpetas de una carpeta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Script para obtener las subcarpetas de las subcarpetas de una carpeta  (Leído 13,506 veces)
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Script para obtener las subcarpetas de las subcarpetas de una carpeta
« en: 28 Diciembre 2008, 06:03 am »

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
  1. Ej:
  2. Set fso=CreateObject("Scripting.FileSystemObject")
  3. Set carpI=fso.GetFolder("C:\")
  4. Set carpsSub=carpI.SubFolders
  5.  
  6. For Each c in carpsSub
  7. msgbox c
  8. 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
  1. Option Explicit
  2. Dim Rutas
  3. Dim oArch, oLArc, oCarI, oCar, objNovCar, oDirTemp
  4. Dim archI, lecArc, carI, LecLin, novCar, subNCar, DirTemp
  5. Dim subsC
  6. Dim BucSkipLine, Conteo
  7. Dim Mensg
  8. Dim InboxA, InboxB
  9. Dim rutCorrect
  10. Dim verArch
  11. Dim ArchFnl
  12.  
  13.  
  14. Set oDirTemp=CreateObject("Scripting.FileSystemObject")
  15. Set DirTemp=oDirTemp.GetSpecialFolder(2)
  16.  
  17. 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)
  18.  
  19.  
  20. If InboxA="" Then
  21. msgbox "Ha elegido Cancelar o no ha escrito texto alguno." & Chr(13) & Chr(13)& "La aplicación se cerrara."
  22. Else
  23.  
  24. Set oCar=CreateObject("Scripting.FileSystemObject")
  25.  
  26. rutCorrect=oCar.FolderExists(InboxA)
  27.  
  28.          If rutCorrect=False Then
  29.          msgbox "La ruta indicada NO existe"
  30.          Else
  31.  
  32.          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")
  33.  
  34.                    If Mensg=6 Then
  35.  
  36.                    InboxB="C:\"
  37.                    Directs
  38.  
  39.                    Else
  40.  
  41.                             If Mensg=7 Then
  42.                             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)
  43.  
  44.  
  45.                                      If InboxB="" Then
  46.                                      msgbox "Ha elegido Cancelar o no ha escrito texto alguno." & Chr(13) & Chr(13) & "La aplicación se cerrara."
  47.                                      Else
  48.  
  49.                                      rutCorrect=oCar.FolderExists(InboxB)
  50.  
  51.                                                  If rutCorrect=False Then
  52.                                                  msgbox "La ruta indicada NO existe"
  53.                                                  Else
  54.                                                  Directs
  55.  
  56.                                                  End If
  57.  
  58.                                      End If
  59.  
  60.                             End If
  61.  
  62.                    End If
  63.  
  64.          End If
  65.  
  66. End If
  67.  
  68. Private Sub Directs()
  69. Set ArchFnl=CreateObject("WScript.Shell")
  70.  
  71. InboxA=InboxA & "\dirs.txt"
  72. Rutas=array(InboxA, InboxB)
  73.  
  74. Set oArch=CreateObject("Scripting.FileSystemObject")
  75. Set archI=oArch.CreateTextFile(Rutas(0), True)
  76.  
  77. Set carI=oCar.GetFolder(Rutas(1))
  78. archI.WriteLine(carI)
  79. archI.Close
  80.  
  81.  
  82. Set oLArc=CreateObject("Scripting.FileSystemObject")
  83. Set lecArc=oLArc.OpenTextFile(Rutas(0), 1)
  84. Set objNovCar=CreateObject("Scripting.FileSystemObject")
  85.  
  86. Conteo=1
  87.  
  88. Do While lecArc.AtEndOfStream=False
  89.  
  90.     On Error Resume Next
  91.  
  92.     LecLin=lecArc.ReadLine
  93.     lecArc.Close
  94.  
  95.     Set novCar=objNovCar.GetFolder(LecLin)
  96.     Set subNCar=novCar.SubFolders
  97.  
  98.          For Each subsC in subNCar
  99.          Set lecArc=oLArc.OpenTextFile(Rutas(0), 8)
  100.          lecArc.WriteLine (subsC)
  101.          lecArc.Close
  102.          Next
  103.  
  104.     Set lecArc=oLArc.OpenTextFile(Rutas(0), 1)
  105.  
  106.          For BucSkipLine=1 to Conteo
  107.          lecArc.SkipLine
  108.          Next
  109.  
  110.     Conteo=Conteo+1
  111. Loop
  112.  
  113. verArch=msgbox ("Ha terminado el proceso" & Chr(13) & Chr(13) & "El archivo creado esta en" & Chr(13) & Chr(13) & InboxA,,"Archivo de directorios")
  114.  
  115. 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:


En línea

kraszic

Desconectado Desconectado

Mensajes: 277


Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #1 en: 28 Diciembre 2008, 13:25 pm »

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
  1. @echo off
  2.  
  3. title Directorios
  4.  
  5. set nom=directorys
  6. :menu
  7. cls
  8. echo ------- DIRECTORIOS
  9. echo Con este script creara un archivo de texto plano con todas las subcarpetas y archivos dentro de la carpeta que quiera.
  10. echo Introduzca la carpeta (sin comillas):
  11. set /p dir=">> "
  12. if not exist "%dir%" (cls & echo No existe el directorio introducido. & echo Pulse cualquier tecla para volver al menu & pause>nul & goto menu)
  13. cls
  14. echo Desea mostrar archivos tambien?
  15. echo 1- Si, archivos y carpetas
  16. echo 2- No, solo carpetas
  17. set /p num=Introduzca un numero:
  18. if %num%==1 (set var=/R & set var1=archivos)
  19. if %num%==2 (set var=/R /D & set var1=carpetas)
  20. echo Espere a que el archivo sea creado.
  21.  
  22. cd "%dir%"
  23. echo Lista de %var1% en "%dir%" > %nom%.txt
  24. echo. >> %nom%.txt
  25. echo. >> %nom%.txt
  26. FOR %var% %%i in (*) DO (echo %%i >> %nom%.txt)
  27. cls
  28. echo El archivo ha sido creado.
  29. start %nom%.txt
  30. echo Pulse cualquier tecla para cerrar el programa.
  31. pause>nul

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


En línea

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

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #2 en: 29 Diciembre 2008, 03:45 am »

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  :)
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #3 en: 29 Diciembre 2008, 15:26 pm »

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
  1. Set objfso = Createobject("Scripting.filesystemobject")
  2. Set objshell = Createobject("Wscript.shell")
  3.  
  4. IDir = "C:\"
  5. objshell.run "cmd /c " & """" & IDir & """ /S /B /A:D > RegFile.txt", vbhide, True
  6. Set IReg = objfso.opentextfile("RegFile.txt",1)
  7.  
  8. Do until IReg.atendofstream
  9. Ruta = IReg.readline
  10. 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
  1. On Error Resume Next
  2. Set objfso = createobject("scripting.filesystemobject")
  3. Set RegFile = objfso.createtextfile("RegFile.txt",True)
  4. Set IDir = objfso.getfolder("c:\")
  5.  
  6. ListDirs(IDir)
  7.  
  8. Function ListDirs(IFol)
  9.  
  10. Regfile.writeline IFol.path
  11. Set SubsIFol = IFol.subfolders
  12.  
  13. For each SF in SubsIFol
  14.   ListDirs(SF)
  15. Next
  16.  
  17. 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
« Última modificación: 1 Enero 2009, 09:03 am por Novlucker » En línea

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
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #4 en: 30 Diciembre 2008, 05:46 am »

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.
En línea

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

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #5 en: 1 Enero 2009, 07:06 am »

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.
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #6 en: 1 Enero 2009, 09:06 am »

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
En línea

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
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #7 en: 2 Enero 2009, 00:32 am »

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.
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #8 en: 2 Enero 2009, 12:19 pm »

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
En línea

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
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Script para obtener las subcarpetas de las subcarpetas de una carpeta
« Respuesta #9 en: 5 Enero 2009, 12:41 pm »

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
  1. Set objfso = createobject("scripting.filesystemobject")
  2. Set RegFile = objfso.createtextfile("RegFile.txt",True)
  3. Set IDir = objfso.getfolder("c:\")
  4.  
  5. ListDirs(IDir)
  6.  
  7. Function ListDirs(IFol)
  8.  
  9. Regfile.writeline IFol.path
  10. Set SubsIFol = IFol.subfolders
  11.  
  12. On error resume next
  13. For each SF in SubsIFol
  14.   ListDirs(SF)
  15. Next
  16.  
  17. End Function
  18.  
  19. Msgbox "Proceso Terminado"

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

Saludos
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

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