Archivo por lotes FOR loop para copiar carpetas solo si existen en otra carpeta

Archivo por lotes FOR loop para copiar carpetas solo si existen en otra carpeta

Estoy intentando escribir un archivo por lotes que copie carpetas de una ubicación de carpeta a otra, pero solo si existen en una tercera carpeta.

Suena confuso, lo intentaré de nuevo.

Tengo las siguientes 3 carpetas:

  • Actualizaciones
  • Aplicaciones
  • Versión anterior

Antes de actualizar la \Applicationsestructura de subcarpetas con la \Updatesestructura de subcarpetas [nueva versión], necesito copiar la \Applicationsestructura de subcarpetas a la \Previous Versionscarpeta. Una vez que esté completo, deberá copiar la Updatesestructura de la subcarpeta a la /Applicationscarpeta.

Llegué hasta lo siguiente:

Setlocal EnableDelayedExpansion

Set UpdtRoot=C:\Test\Updates
Set AppsRoot=C:\Test\Apps
Set PVerRoot=C:\Test\Previous Versions

FOR /d %%i IN ("!UpdtRoot!\*.*") DO xcopy "!AppsRoot!\%%~nxi" "!PVerRoot!\%%~nxi\" /e

Sin embargo, esto no funciona, copia todas las carpetas de AppsRoot a PVerRoot.

Lo necesito para copiar subcarpetas de AppsRoota PVerRoot, pero solo si existen en UpdtRoot. Solo lo necesito para copiar SOLAMENTE las carpetas y subcarpetas, por lo que no hay ningún archivo.

Respuesta1

He incluido un script por lotes que debería completar lo que explica para copiar todas las subcarpetas de forma recursiva del /Applicationsdirectorio al /Previous Versionsdirectorio, pero SÓLO si esos mismos directorios 'para copiar' existen en el /Updatesdirectorio.

Artículos notables

  • Asegúrese de que SET NewCopyDir=%CopyDir:C:\Test\Apps\=%tenga los C:\Test\Apps\caracteres que coincidan con la Applicationsruta completa del directorio, incluida la barra invertida final. Esta es la lógica que analiza eso para agregarlo al final de los /Updatesdirectorios y /Previous Versionspara que los XCOPYcomandos copien esos directorios en consecuencia.

  • La Rootparte de los nombres se eliminó de las SETvariables de los directorios, pero eso realmente no importa, pero los acorté para que se viera un poco más limpio en la lógica del script.

Guión por lotes

@ECHO ON

SET "Updt=C:\Test\Updates"
SET "Apps=C:\Test\Apps"
SET "PVer=C:\Test\previous Versions"
IF NOT EXIST "%Updt%" MD "%Updt%"
IF NOT EXIST "%Apps%" MD "%Apps%"
IF NOT EXIST "%PVer%" MD "%PVer%"

FOR /D %%S IN ("%Apps%\*") DO (
    CALL :Routine "%%~S"
)
GOTO :EOF

:Routine
SET CopyDir=%~1
SET NewCopyDir=%CopyDir:C:\Test\Apps\=%
IF EXIST "%Updt%\%NewCopyDir%" XCOPY /E /T "%Apps%\%NewCopyDir%" "%PVer%\%NewCopyDir%\"
GOTO :EOF

Recursos de apoyo

  • LLAMAR
  • XCOPIAR

      /E           Copies directories and subdirectories, including empty ones.
                   Same as /S /E. May be used to modify /T.
    
      /T           Creates directory structure, but does not copy files. Does not
                   include empty directories or subdirectories. /T /E includes
                   empty directories and subdirectories.
    

información relacionada