Loop FOR de arquivo em lote para copiar pastas somente se elas existirem em outra pasta

Loop FOR de arquivo em lote para copiar pastas somente se elas existirem em outra pasta

Estou tentando escrever um arquivo em lote que copie pastas de um local para outro, mas somente se elas existirem em uma terceira pasta.

Isso parece confuso, vou tentar novamente.

Eu tenho as seguintes 3 pastas:

  • Atualizações
  • Formulários
  • Versões prévias

Antes de atualizar a \Applicationsestrutura de subpastas com a \Updatesestrutura de subpastas [nova versão], preciso copiar a \Applicationsestrutura de subpastas para a \Previous Versionspasta. Depois de concluído, será necessário copiar a Updatesestrutura de subpastas para a /Applicationspasta.

Cheguei ao seguinte:

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

Porém, isso não funciona, ele copia todas as pastas do AppsRoot para o PVerRoot.

Preciso copiar subpastas de AppsRootpara PVerRoot, mas apenas se elas existirem em UpdtRoot. Eu só preciso copiar APENAS as pastas e subpastas, para que não haja nenhum arquivo.

Responder1

Incluí um script em lote que deve completar o que você explica para copiar todas as subpastas recursivamente de um /Applicationsdiretório para outro /Previous Versions, mas SOMENTE se esses mesmos diretórios 'para copiar' existirem no /Updatesdiretório.

Itens notáveis

  • Certifique-se de que SET NewCopyDir=%CopyDir:C:\Test\Apps\=%contém os C:\Test\Apps\caracteres que correspondem ao Applicationscaminho completo do diretório, incluindo a barra invertida final. Esta é a lógica que analisa isso para anexar ao final dos /Updatesdiretórios e /Previous Versionspara que os XCOPYcomandos copiem esses diretórios de acordo.

  • A Rootparte dos nomes foi retirada das SETvariáveis ​​dos diretórios, mas isso realmente não importa, mas eu os reduzi para que parecesse um pouco mais limpo na lógica do script.

Script em lote

@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 apoio

  • CHAMAR
  • 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.
    

informação relacionada