Só para entender, você tem uma única fonte, com vários destinos idênticos. Você está fazendo alterações na sua origem (criações, atualizações, exclusões) e deseja tornar seus destinos facilmente idênticos à fonte com todas essas alterações?
Então é disso que você precisa:
robocopy "\sourcepath\folder" "\destinationpath1\folder" /MIR /NFL /NDL
robocopy "\sourcepath\folder" "\destinationpath2\folder" /MIR /NFL /NDL
robocopy "\sourcepath\folder" "\destinationpath3\folder" /MIR /NFL /NDL
A opção / MIR tornará seus destinos idênticos à sua origem, incluindo suas ações de exclusão. O / NFL e o / NDL param o robocopy da saída dos arquivos e pastas que estão sendo alterados. Isso produz uma saída simples que lista o número e o tamanho dos arquivos alterados. Se você quiser um log do que foi sincronizado, exclua essas opções.
No entanto, se você tiver alguma personalização configurada nos seus destinos, eles serão removidos.
Atualização após o primeiro comentário de Chris sobre esta resposta
Eu não acho que o que você está procurando seja nativamente possível com robocopy ou outras ferramentas de linha de comando.
No entanto, aqui está um código psuedo que faria o que você está procurando, eu acho. O roteiro real está além das minhas habilidades sem muita pesquisa, mas esse é o fluxo de trabalho que você precisa:
$codebase = "\codebase\"
$comparesource = "\destination to compare to codebase\"
$packagesource = "\where you store update package files\"
$finaldestination = "\path you're actually trying to update\"
robocopy $codebase $comparesource /MIR /LOG:c:\log.txt /FP /NS /NJH /NJS /L
- / FP = Caminho completo listado no log arquivo
- / NS = Nenhum tamanho listado no arquivo de log
- / NJH e / NJS = sem cabeçalho de job e resumo no arquivo de log
- / L = Apenas liste o que aconteceria Na verdade, não faça nenhuma alteração
Isso fornecerá um arquivo com saída assim:
*EXTRA File C:\file1.txt
New File c:\file2.xls
Newer c:\file3.txt
Então, isso precisaria ser executado:
If line contains "newer" or "New File" rest of line enters array $copyfilename
If line contains "*EXTRA" rest of line enters array $deletefilename
\This would only work for a flat structure; subfolders complicate things and you'd need to grab the file name and subfolder name instead.
for each in $copyfilename {
robocopy $codebase\$copyfilename $packagesource\$copyfilename /e
Append above line to $packagesource\updatepackage.bat, replacing $codebase with $packagesource and $packagesource with $finaldestination
}
for each in $deletefilename {
append "del $finaldestination\$deletefilename" to $packagesource\updatepackage.bat
}
No final, você terá uma pasta (seu $ packagesource) que contém arquivos novos e alterados, bem como um arquivo em lotes que possui comandos de cópia para esses arquivos novos e alterados, e comandos de exclusão para os arquivos removidos. arquivos.