Robocopy / xd com curingas e sub-caminhos

3

Eu não acho que essa pergunta exata tenha sido feita antes (eu olhei).

Meu servidor de backup executa um script usando o Robocopy e eu quero excluir arquivos que realmente não precisam de backup, especificamente:

*\AppData\Local\Google 
*\AppData\Local\Microsoft\Windows 
*\AppData\Local\NVIDIA 
*\AppData\Local\Temp 
*\AppData\LocalLow\Google

(todos eles têm um milhão de arquivos de cache minúsculos que demoram muito tempo para analisar, mas não são necessários para a restauração; a maior parte do tempo de execução do backup incremental está processando-os)

O caminho anterior a "\ AppData ..." varia, dependendo do nome da máquina, nome de usuário (múltiplos usuários por máquina) e estrutura de pastas naquela máquina em particular (nem todos possuem todos os seus dados em c:).

Para manter as coisas simples, eu tenho uma variável de ambiente chamada _exclude que eu uso em cada chamada para Robocoy:

SET _exclude= /XD *AppData\Local\Google *AppData\Local\Temp [...etc]

Eu não quero excluir todos os diretórios que contenham "AppData" ou "Local" ou "Google", pois isso excluiria dados valiosos. Apenas esses sub-caminhos particulares.

Eu tentei com e sem '\', com e sem aspas duplas em torno dos caminhos, com / sem '*' e permutações deles.

Existe qualquer maneira de fazer isso funcionar com o Robocopy, sem codificar o caminho específico para cada usuário em cada máquina?

    
por nerdfever.com 12.11.2014 / 19:46

1 resposta

4

Robocopy definitivamente não fará o que você está procurando por conta própria.

Inicialmente, pensei em dizer a você para escrever um script que gera dinamicamente a lista de exclusões, mas é provável que você encontre as limitações de tamanho da linha de comando.

Com isso em mente, acho que seria melhor escrever um script para criar um arquivo "job" de Robocopy. Aqui está um script para criar um trabalho simples dinamicamente com base no conteúdo de C:\Users :

@echo off
set DEST=\SERVER\SHARE
set SRC=C:\Users
set RCJ=%RANDOM%.RCJ

echo /DD:%DEST%>%RCJ%
echo /SD:%SRC%>>%RCJ%
echo /IF>>%RCJ%
echo *>>%RCJ%
echo /S     :: copy Subdirectories, but not empty ones.>>%RCJ%
echo /E     :: copy subdirectories, including Empty ones.>>%RCJ%
echo /COPY:DAT  :: what to COPY for files (default is /COPY:DAT).>>%RCJ%
echo /PURGE     :: delete dest files/dirs that no longer exist in source.>>%RCJ%
echo /MIR       :: MIRror a directory tree (equivalent to /E plus /PURGE).>>%RCJ%
echo /R:1000000 :: number of Retries on failed copies: default 1 million.>>%RCJ%
echo /W:30      :: Wait time between retries: default is 30 seconds.>>%RCJ%
echo /XD        :: eXclude Directories matching these names>>%RCJ%

for /d %%i in (%SRC%\*) do call :_de "%%i">>%RCJ%

robocopy /job:%RCJ%
del %RCJ%
goto :EOF

:_de
echo %~1\AppData\Local\Google
echo %~1\AppData\Local\Microsoft\Windows
echo %~1\AppData\Local\NVIDIA
echo %~1\AppData\Local\Temp
echo %~1\AppData\LocalLow\Google

Eu fiquei muito arrogante nesse script, indo em frente e executando robocopy e excluindo o arquivo de trabalho. Eu comentaria essas linhas enquanto você estivesse testando, e provavelmente adicionaria alguma verificação do errorlevel após a conclusão de robocopy .

    
por 12.11.2014 / 21:51