Como buscar y copiar carpetas que se encuentran en una lista .txt desde un disco externo al local por medio de un archivo .bat

Soy nuevo en las ciencias informáticas, necesito ayuda con un .bat para Windows que me permita buscar carpetas dentro de una unidad de disco duro externa, el nombre de las carpetas están en una lista en un archivo .txt llamado "Origen.txt", una vez los encuentre los copie a la unidad de disco local C:/, he intentado con el siguiente código; sin embargo, no tengo resultado positivo.

1 respuesta

Respuesta
1

Veo que no has puesto el código con el que lo intentabas, o no llegó a su destino.

Te propongo que pruebes con esto:

@echo off
set unidad=d
set carpeta=d:\carpeta prueba\aaaaa
set archivo=origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do if exist "%unidad%:\%%i" echo xcopy /s /c /i "%unidad%:\%%i" "c:\%%i"
Popd
Pause

Ajusta las variables UNIDAD, CARPETA y ARCHIVO a tus necesidades. La unidad sería la que corresponde al disco externo, la carpeta sería la que contiene el archivo con la lista de las carpetas a copiar (que sería ORIGEN.TXT). Tal como está el BAT en lugar de hacer la copia (he elegido XCOPY para hacerla) "presenta" en pantalla el comando que haría la copia, para que puedas controlar si va a hacerlo como esperas. Y le he puesto un PAUSE para que no se cierre la ventana.

Prueba y nos dices.

Gracias por su respuesta, sin embargo, aún no logro conseguir que se copien las carpetas, por favor si me pueden seguir ayudando se los agradecería mucho, el punto es que necesito que busque dentro de todo la unidad las carpetas que se encuentran listadas en el archivo "Origen.txt", el código quedo así, pero solo me muestra como resultado la pantalla de CMD.

@echo off
set unidad=E
set carpeta=E:\
set archivo=C:\Users\flema\OneDrive\Escritorio\buscar_fotos\Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do if exist "%unidad%:\%%i" echo xcopy /s /c /i "%unidad%:\%%i" "C:\Users\flema\OneDrive\Escritorio\buscar_fotos\%%i"
Popd
Pause

Vamos a ver si avanzamos algo. Empezaré por comentarte que para hacer más "legible" el código del BAT suele ser buena idea incluirlo en una ventanita auxiliar (snippet, le llama la barra de herramientas de la página) y a ella se accede con el icono "<>" de la barra (tercero desde la derecha). Por lo que deduzco de lo que has escrito el bat podría ser así:

@echo off
set unidad=E
set carpeta=C:\Users\flema\OneDrive\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do if exist "%unidad%:\%%i" echo xcopy /s /c /i "%unidad%:\%%i" "%carpeta%\%%i"
Popd
Pause

Como te decía esta versión del BAT no hace las copias sino que solo te presenta los comandos de copia que se ejecutarían. Supongamos que origen.txt contiene lo siguiente:

Fotos coches
Vacaciones 2021
Excursion a la playa

y que en la unidad E: existen carpetas E:\Fotos coches y E:\Excursion a la playa pero no E:\Vacaciones 2021. En la ventana CMD debería salir algo como:

xcopy /s /c /i "E:\Fotos coches" "C:\Users\flema\OneDrive\Escritorio\buscar_fotos\Fotos coches"
xcopy /s /c /i "E:\Excursion a la playa" "C:\Users\flema\OneDrive\Escritorio\buscar_fotos\Excursion a la playa"
Presione una tecla para continuar . . .

Si esas copias son lo que esperas, puedes quitar el comando ECHO del DO del FOR, con lo que el BAT quedaría así:

@echo off
set unidad=E
set carpeta=C:\Users\flema\OneDrive\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do if exist "%unidad%:\%%i" xcopy /s /c /i "%unidad%:\%%i" "%carpeta%\%%i"
Popd
Pause

y así ya se harían las copias.

Si las cosas no ocurren de este modo captura la pantalla de la ventana CMD e inclúyela por aquí con el icono de "Añadir imagen", el primero de la izquierda en la barra de herramientas de la página

Para facilitar la depuración puedes usar esta otra versión del BAT que nos iría contando lo que va haciendo:

@echo off
set unidad=E
set carpeta=C:\Users\flema\OneDrive\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do (
   echo buscando carpeta %unidad%:\%%i
   dir %unidad%:\%%i   
   if exist "%unidad%:\%%i" echo xcopy /s /c /i "%unidad%:\%%i" "%carpeta%\%%i"
   )
Popd
Pause

Saludos,

El inconveniente es que dentro del disco externo las carpetas no se encuentran en la raíz, sino que están distribuidas en subcarpetas y hay que buscar los nombre de "Origen.txt" dentro de esas subcarpetas (Adjunto las imágenes)

Es decir que para encontrar las carpetas, el programa tiene que buscar en todo la unidad E

De antemano, gracias por su paciencia y ayuda.

Claro, eso cambia bastante el planteamiento. Una solución sería incluir todo el path de las carpetas en ORIGEN.TXT pero intuyo que eso no ayudaría mucho porque si se conoce previamente esa información, el BAT no aporta gran cosa.

Vamos a probar con esto:

@echo off
rem set unidad=D
rem set carpeta=D:\bat
set unidad=E
set carpeta=C:\Users\flema\OneDrive\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do (
   echo buscando carpeta %%i en toda la unidad %unidad%:\
   for /f "tokens=*" %%x in ('dir /b /s /ad %unidad%:\ ^| find "%%i"') do (
      Echo encontrada carpeta %%x
      ) 
   )
Popd
Pause

Si vamos por buen camino ahora debería sacar un mensaje con todo el path en el que haya encontrado cada una de las carpetas. Lo siguiente ya sería incluir el comando de copia, pero vamos a esperar un poco.

Acabo de ver que no hice "limpieza" en lo que puse y se me colaron instrucciones/comandos utilizados en mis pruebas locales. No tiene demasiada importancia pero debería ser así:

@echo off
set unidad=E
set carpeta=C:\Users\flema\OneDrive\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do (
   echo buscando carpeta %%i en toda la unidad %unidad%:\
   for /f "tokens=*" %%x in ('dir /b /s /ad %unidad%:\ ^| find "%%i"') do (
      Echo encontrada carpeta %%x
      ) 
   )
Popd
Pause

Saludos,

Funciona muy bien, sin embargo, toma demasiado tiempo el ubicar las carpetas, es normal ese comportamiento?

Lleva varias horas y aún no hay resultado.

Dices que funciona muy bien, pero que lleva varias horas y aún no hay resultado. No sé como entender estas afirmaciones un tanto contradictorias. Puede ser normal que tarde mucho si la unidad explorada es de gran capacidad. También puede influir si la conexión es USB 1.x.

Te sugiero que hagas una prueba manual a ver si es razonable lo que comentas:

1. Abre una ventana CMD

2. Teclea

dir E:\ /b /s /ad | find "19200330"

El tiempo que tarde en terminarse el comando debería darte una idea de lo que puede tardar en cada búsqueda (me he basado en el pantallazo para generar el ejemplo).

Voy a investigar caminos alternativos para localizar una carpeta en un disco conociendo solo su nombre pero no su ubicación.

Saludos, 

En efecto, el código funciona bien, imprimió la ruta del directorio buscado, el inconveniente es que demoro varias horas.

Yo creo que debe haber algo dañado en ese disco externo.

He realizado una prueba similar en mi entorno (Windows 10 Home, portátil Lenovo i7 a 2.6 GHz) sobre un disco externo Toshiba de 1 TByte y me ha tardado 2 minutos por un puerto USB 3.0 y un poco más de 3 minutos para esa misma prueba a través de un USB 2.0.

¿Puedes decirme algo más de tu entorno de ejecución y del disco duro externo? Si hay sospechas de mal funcionamiento no estaría de más lanzar el comando CHKDSK sobre ese disco externo.

Sigo buscando alternativas pero, de momento, no he encontrado ninguna.

Creo que he encontrado una alternativa más rápida. Para la prueba que estamos usando como "control" te sugiero que conviertas el comando del punto 2 en éste:

dir E:*19200330*.* /b /s /ad

Prueba y dime cuánto tarda ahora

Perdón, creo que hace falta la "\". Sería

dir E:\*19200330*.* /b /s /ad

El disco duro es de terabytes, con conexión 2.0, funciona lento y necesita privilegios de administrador para acceder a buscar la información, realice la prueba de búsqueda, iniciando a las 8:00 a.m y hasta 17:00 encontró uno de los directorios.

Es una barbaridad. Dices que el disco es "de terabytes", pero no de cuantos terabytes, pero no comprendo que pueda tardar tanto. Como digo en las pruebas con un disco externo mío de 1 TByte los tiempos son del orden de 3 minutos para una conexión USB 2.0. Me temo que si no se encuentra un problema físico que lo explique y que se pueda resolver, no habrá manera razonable de trabajar con él para estas cosas.

Tenía bastante confianza en la opción que no utilizaba el FIND porque, de alguna manera pensaba que al pasar al comando DIR la localización de las carpetas se haría que trabajara directamente sobre la "tabla de contenidos" del disco en vez de dejar al FIND esa comparación. Por cierto, ¿se trata de un disco FAT o NTFS o de algun otro tipo?

Saludos, una disculpa por omitir la capacidad de almacenamiento, que es de 1,8 terabytes 

Es un disco grande y es NTFS. Es decir, normal. No entiendo que tarde tanto y lamento decir que ya no se me ocurre ninguna alternativa.

Agradezco su ayuda y compresión 

Una última pregunta, me encuentro creando un .bat que cree una carpeta con la fecha, actual, con formato: "día/mes/año"; sin embargo, no consigo que se cree dicho directorio 

@echo off
SET Origen=C:\Users\flema\OneDrive\Escritorio\Origen
SET Destino=C:\Users\flema\OneDrive\Escritorio\Destino%date:~0,2%%date:~3,2%%date:~6,4%-%Time:~0,2%%Time:~3,2%
MKDIR %Destino%
XCOPY %Origen\*.* %Destino%\. /v /e /f /h /y

Observo una errata en tu BAT, en el uso de la variable ORIGEN en el comando de copia falta el "%" de cierre. Y creo que sobra el "." después de %Destino%\

Por otra parte intuyo que hay otro error en la asignación de valor a la variable DESTINO porque creo que quieres crear una carpeta de nombre, digamos, 07062022-1439, dentro de la carpeta

C:\Users\flema\OneDrive\Escritorio\Destino.

Si es así te falta un "\".

Las opciones del XCOPY no voy a analizarlas, supongo que son adecuadas.

Saludos,

Migre la información a un NAS, sin embargo, para la búsqueda estoy usando la información que muy amablemente me ayudo, sin embargo, me muestra el siguiente mensaje:

@echo off
set unidad=\\192.168.20.147\DVol1\Temp\Images
set carpeta=C:\Users\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpeta%
for /f "usebackq tokens=*" %%i in (%archivo%) do (
   echo buscando carpeta %%i en toda la unidad %unidad%:\
   for /f "tokens=*" %%x in ('dir /b /s /ad %unidad%:\ ^| find "%%i"') do (
      Echo encontrada carpeta %%x
     xcopy /s /c /i "%unidad%:\%%i" "C:\Users\Escritorio\buscar_fotos\%%i"
      ) 
   )
Popd
Pause

De antemano, muchas gracias

Es obvio que el bat no corresponde, exactamente, al pantallazo (ni la IP es la misma ni el path es idéntico). No obstante para ver dónde está el problema te sugiero que pruebes directamente el comando. Algo así:

DIR /B /S /AD \\192.168.10.117\DataVol1\Temp\ImagesForPassages:\ |find "574753"

Lo que conteste a este comando directo debería darnos una pista. Intuyo que los ":" que siguen a %unidad% en el segundo FOR, tendrán algo que ver porque "E:" se admite en una unidad física (o partición con rango de unidad) pero creo que no se permiten en una carpeta. En realidad a lo que llamas UNIDAD en este BAT es, en realidad, una carpeta de red y en este caso los ":" no parece que procedan.

Si no me equivoco sería más adecuado el BAT siguiente:

@echo off
set carpOrig=\\192.168.10.117\DataVol1\Temp\ImagesForPassages
set carpDest=C:\Users\Escritorio\buscar_fotos
set archivo=Origen.txt
pushd %carpDest%
for /f "usebackq tokens=*" %%i in (%archivo%) do (
   echo Buscando carpeta %%i en toda la carpeta origen %carpOrig%
   for /f "tokens=*" %%x in ('dir /b /s /ad %carpOrig% ^| find "%%i"') do (
      echo encontrada carpeta %%i
      xcopy /s /c /i "%carpOrig%\%%i" "%%i"
      ) 
   )
Popd
Pause

Gracias me funciona la solución expuesta

Hola nuevamente, estoy intentando crear un .bat que realice una copia de seguridad de una base de datos, que copie la base y la comprima en un archivo .rar con el mismo nombre de la base, crear una tarea programada para que lo realice diariamente, el inconveniente es que no logro que comprima el archivo, simplemente se copia, el programador de tareas simplemente se salta el comando, estoy trabajando en Windows 7 y Windows 10, en ninguno funciona con la tarea programada, si lo ejecuto manualmente si funciona.

rem copia de la base
robocopy H:\origen H:\destino1 /E /MaxAge:1 /xf *.Bases_de_datos_procelec
rem compresion 
for %%F in (*.bak) do "C:\Program Files\WinRAR\WinRAR.exe" a -ad -o- -r -df -m5 "%%F.rar" "%%F"
rem copia del archivo comprimido al destino fianl
robocopy H:\destino H:\Carpeta_backup /MOVE /MaxAge:1 /xf *.bat

De antemano gracias

Teniendo en cuenta que buena parte de la utilidad de esta página (y de otras similares) se basa en que alguien encuentre una solución a un problema que tiene y que en buena medida depende de que el problema planteado se parezca a alguno ya tratado, te sugiero que abras una nueva pregunta para este otro asunto, porque no tiene mucho que ver con la pregunta original.

Lo que sí que te anticipo es que veo que tu bat comprime por separado cada uno de los archivos BAK. No conozco muy a fondo el ROBOCOPY aunque sé que es muy potente y versátil. En cuanto a conseguir que una tarea programada salga adelante ya te anticipo que yo he tenido que hacer muchas pruebas porque cuando no es porque el usuario no es el adecuado hay otra cosilla. Pero creo que podré ayudarte a sacarla adelante, al menos en Windows10 (estoy de vacaciones y solo tengo el portátil, con esa versión)

gracias

No he visto que hayas abierto otra pregunta. Si te parece bien ábrela y te diré algo, en cuanto pueda hacerlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas