Autor
|
Tema: Script para obtener las subcarpetas de las subcarpetas de una carpeta (Leído 14,101 veces)
|
‡‡‡ Ðξλ†Ћ Щλ†ζЋ ‡‡‡
Desconectado
Mensajes: 56
|
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.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: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
|
|
|
En línea
|
|
|
|
kraszic
Desconectado
Mensajes: 277
|
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. :menu cls echo Con este script creara un archivo de texto plano con todas las subcarpetas y archivos dentro de la carpeta que quiera. echo Introduzca la carpeta (sin comillas ): 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 1- Si, archivos y carpetas echo 2- No, solo carpetas 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 Espere a que el archivo sea creado. echo Lista de %var1% en " %dir%" > %nom%.txt cls echo El archivo ha sido creado. start %nom%.txt echo Pulse cualquier tecla para cerrar el programa.
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
Mensajes: 56
|
kraszic se ve bueno el code, ademas de sencillo La verdad es que a batch no le termino de entender 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
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Buen trabajo BlaKore_AlphaAquí 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 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 Ahora el otro ... 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 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
Mensajes: 56
|
Antes que nada, gracias por el tiempo dedicado en leer el post. Que bueno que les haya agradado, y ojala les pueda servir de algo. 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
Mensajes: 56
|
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
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Son independientes, el primero lo he modificado, ya que había dejado creada la variable IDir, pero la creaba luego de llamarla 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 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
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Yo otra vez 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 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
|
|
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayudenme , necesito un codigo en Borland C++ que Copie Carpetas y Subcarpetas
Programación C/C++
|
LAOMGD
|
1
|
2,948
|
2 Agosto 2011, 00:15 am
por fary
|
|
|
Eliminar subcarpetas de un directorio con excepciones con batch
Scripting
|
Andrew06
|
4
|
6,765
|
24 Enero 2013, 02:19 am
por Andrew06
|
|
|
[VB6]Comprimir Carpetas y SubCarpetas sin necesidad de OCX o DLLs
Programación Visual Basic
|
Brian1511
|
6
|
8,445
|
13 Febrero 2016, 18:48 pm
por Brian1511
|
|
|
agregar prefijo a todos los archivos PDF contenidos en una carpeta y sus subcarpetas
Scripting
|
aidiko
|
2
|
7,651
|
14 Julio 2022, 23:39 pm
por EdePC
|
|
|
Descifré cómo ver los archivos de una carpeta y subcarpetas ordenados por fecha en W7.
Windows
|
Tachikomaia
|
1
|
6,179
|
14 Julio 2023, 18:11 pm
por Fernando Morales
|
|