Arquivo em lote FOR loop para copiar pastas somente se elas existirem em outra pasta

3

Estou tentando gravar um arquivo em lote que copia pastas de um local de pasta para outro, mas apenas se elas existirem em uma terceira pasta.

Isso parece confuso, vou tentar novamente.

Eu tenho as seguintes 3 pastas:

  • Atualizações
  • Aplicativos
  • Versões anteriores

Antes de atualizar a estrutura da subpasta \Applications com a estrutura da subpasta [nova versão] \Updates , preciso copiar a estrutura da subpasta \Applications para a pasta \Previous Versions . Quando isso estiver concluído, será necessário copiar a estrutura da subpasta Updates para a pasta /Applications .

Cheguei até o 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

Isso não funciona, ele copia todas as pastas do AppsRoot para o PVerRoot.

Eu preciso copiar as subpastas de AppsRoot para PVerRoot , mas somente se elas existirem em UpdtRoot . Eu só preciso copiar as pastas e subpastas SOMENTE, sem arquivos.

    
por dts256 28.01.2016 / 04:15

1 resposta

0

Batch file FOR loop to copy folders only if they exist in another folder

I'm trying to write a batch file that copies folders from one root folder to another, but only if they exist in a third folder.

What I'd like to be able to do is copy folders from AppsRoot to PVerRoot, but only if they exist in UpdtRoot.

comment: it's only folders that I need to copy.

Há um script em lote abaixo que deve concluir o que você explica que precisa copiar todas as subpastas recursivamente do diretório /Applications para o diretório /Previous Versions , mas SOMENTE se esses mesmos diretórios para copiar existirem no diretório /Updates .

Notas: Você precisará garantir que SET NewCopyDir=%CopyDir:C:\Test\Apps\=% tenha os caracteres C:\Test\Apps\ correspondentes ao caminho completo do diretório Applications , incluindo a barra invertida final. Esta é a lógica que analisa isso para anexar ao final dos diretórios /Updates e /Previous Versions , então os comandos XCOPY copiarão esses diretórios de acordo.

Eu tirei a parte Root dos nomes das suas variáveis SET para os diretórios, mas isso realmente não importa, mas eu os encurtei para que parecesse um pouco mais limpa na lógica do script.

Exemplo de 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

Mais detalhes e recursos

Opções do XCOPY usadas

  /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.
    
por 28.01.2016 / 06:56