Script de copia rápida de archivos en Windows

Script de copia rápida de archivos en Windows

Tengo un proceso que se ejecuta aproximadamente cada mes. Dicho proceso identifica un conjunto de archivos y construye una ruta de origen y destino adecuada a partir de varios campos de diferentes tablas en la base de datos para luego copiar todos estos archivos, por lo que termino con potencialmente cientos de miles o millones de rutas. Es posible que estas rutas apunten a un archivo que haya sido copiado previamente, pero que haya sido modificado.

¿Cómo puedo realizar esta copia de la forma más rápida posible?

Al principio probé un script cmd enorme y simple que verificaba si el archivo, según la ruta resultante, existía en la ruta de destino y luego intenté copiarlo si no existía, pero los archivos modificados se omitieron. Entonces, intenté usar "xcopy" para evitar la sobrescritura si la fecha es la misma, usando el interruptor /D y el interruptor /Y para confirmar silenciosamente el mensaje, pero en la práctica, un script enorme con cientos de miles de comandos xcopy toma para siempre y no veo ninguna aceleración cuando algunos o la mayoría de estos archivos ya existen con la misma fecha. ¿Tienes alguna idea que pueda ayudarme? ¿Qué puedo hacer con un archivo que contiene cientos de rutas de origen y destino para hacer una copia de todas ellas? ¿Existe una alternativa más rápida a xcopy? ¿O una verificación de fecha más rápida y luego llamar a cualquier comando de copia?

Una explicación más detallada sobre cómo obtengo y copio archivos actualmente según la información de la base de datos: Hay varias tablas en la base de datos:

Tabla 1: ID, Dir_Name, ...

Tabla 2: ID, Dir_Name, ...

...

Tabla N: ID, Dir_Name, ...

Tabla de rutas de carpetas de origen: Dir_Name, Dir_FullPath

Tabla de rutas de carpetas de destino: Dir_Name, Dir_FullPath

Luego puedo crear el conjunto de comandos de copia (o simplemente obtener las rutas de origen y destino)

Select 'xcopy /d /y '|| T2.Dir_FullPath || '\\' || ID || '.ext ' || T3.Dir_FullPath || '\\' || ID || '.ext*' 
from Table1 T1 
left join SourceFolderPathsTable T2 on T1.Dir_Name=T2.Dir_Name
left join DestFolderPathsTable T3 T1.Dir_Name=T3.Dir_Name where T1.some_criteria=true;

¡Gracias!

Respuesta1

Eche un vistazo a la herramienta de línea de comandos "robocopy" que viene con Windows. Creo que puede aceptar un archivo de respuesta, y ya se le puede indicar que actualice solo los archivos que han cambiado de fecha/hora, además es lo más rápido posible, ya que es una línea de comando pura sin sobrecarga de GUI.

información relacionada