Use XCOPY com as opções / D e / L, "copiando" da pasta 1 para a pasta 2.
A opção / D restringe a cópia apenas aos arquivos novos ou modificados.
A opção / L faz com que o comando liste os arquivos que seriam copiados, mas impede que quaisquer cópias sejam realmente feitas.
Em seguida, use FOR / F para processar esses resultados e copie os arquivos para a pasta 3.
for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul
Se colocar em um arquivo de lote, todo %
deve ser dobrado como %%
.
O XCOPY também imprime um resumo de quantos arquivos são (seriam) afetados. O acima tentará copiar um arquivo com a contagem de resumo "name" e, é claro, falhará. O redirecionamento da saída para nul impede que a mensagem de erro seja exibida. Eu testei no Windows 7 e fiquei surpreso com a mensagem de erro no stdout e não no stderr. Se a mensagem de erro em outras versões estiver aparecendo no stderr, o comando também deverá receber 2 > nul para evitar a mensagem de erro.
Mas há um risco em esconder as mensagens de erro - e se uma cópia falhar por algum motivo?
Aqui está um script que listará todos os arquivos que foram copiados com sucesso, além de indicar quais (se houver) falharam. Ele usa FINDSTR para filtrar a contagem de arquivos indesejados. Ele assume que a contagem de arquivos está em inglês, com o formato NNN File(s)
, portanto, teria que ser modificado para outros idiomas.
@echo off
for /f "eol=: delims=" %%F in (
'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"
Aqui está uma variante mais complexa que funciona com qualquer idioma. Ele salva cada nome de arquivo em uma variável e atrasa a cópia até a próxima iteração do loop. A última entrada (a contagem) nunca é copiada.
@echo off
setlocal disableDelayedExpansion
set "file="
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
if defined file (
setlocal enableDelayedExpansion
copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"
endlocal
)
set "file=%%F"
)