Automatizar uma tarefa de backup de pasta (zip, move e renomeie de acordo com a convenção de nomenclatura)

1

Eu estou tentando automatizar o backup de uma pasta em um servidor Windows 2003 R2 (atualmente um processo manual).

Existem três componentes para esta tarefa:

1) Gere um arquivo zip da seguinte pasta no mesmo diretório, sem usar software de terceiros:

d:\source\folder_to_back_up

O que nos dá:

d:\source\folder_to_back_up.zip

2) Mova o arquivo zip recém-criado para:

d:\destination

3) Renomeie o arquivo zip de acordo com a seguinte convenção de nomenclatura:

Backup_YYYYMMDD.zip

Por exemplo, usando a data de hoje, o nome seria:

Backup_20150516.zip

Até agora, descobri como automatizar o passo 2:

robocopy /mov d:\source d:\destination folder_to_back_up.zip

... mas precisa de ajuda para automatizar a criação do arquivo zip e também a etapa de renomeação.

Qualquer ideia seria muito apreciada!

    
por Austin ''Danger'' Powers 16.05.2015 / 09:19

2 respostas

1

Desde que você começou a considerar o 7-zip nos comentários da outra resposta, aqui está como eu fiz:

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
rem # a: Add, -mx: compression level 0-9, -tzip use ZIP format, -ssc: case sensitive, -ssw: add files opened for writing, -r: recursive
pushd "%SOURCE%" && 7za a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd

Note que este é essencialmente um one-liner se você inline as variáveis source e dest. O par pushd / popd está lá para que o contexto não seja alterado caso você esteja fazendo vários backups em um lote. %date% é um built-in.

Não acho razoável criar um formato de arquivo especial (zip) sem as ferramentas adequadas. É como querer compilar o código-fonte Java em jars sem um JDK.

Dependências

Você pode contornar o problema de excluir a ferramenta com o código acima em backup_stuff.bat e copiando 7za.exe ao lado do arquivo chamado backup_stuff.bat-7za.exe e, em seguida, só precisa substituir 7za por %~dp0\backup_stuff.bat-7za para faça referência exatamente a esse arquivo. Isso deve entregar a mensagem de que há uma dependência externa aqui ...

Como alternativa, se você quiser ser realmente paranóico, basta inserir 7zip no arquivo de lote:)

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination

goto deps

:exec
pushd "%SOURCE%" && "%TEMP%za" a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
goto end

:deps
@(
rem This is the Base64 enconded version of 7za.exe
rem To create this section execute the following commands:
rem certutil -encode 7za.exe 7za.exe.b64
rem echo @echo off>7za.exe.b64.bat && for /F "tokens=*" %L in (7za.exe.b64) do @echo echo %L>>7za.exe.b64.bat

echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB9EXJSOXAcATlwHAE5cBwB
echo QmwQATtwHAG6bBIBIHAcAQ9WFgFbcBwBt3hDAThwHAE5cB0BlnAcAbp4QQE+cBwB

rem ... lot of lines ommitted for sake of stackoverflow

echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>%TEMP%za.exe.b64
certutil -decode -f %TEMP%za.exe.b64 %TEMP%za.exe >NUL

goto exec

:end

Meu cmd travou quando tentei fazer isso com o arquivo exe 7-zip v9.20 original. Parece que há uma limitação no comprimento do bloco (...) , eu achei que fosse em torno de 370kB (aproximadamente 5000 linhas de b64). A base64 original do 7-zip era 800kB, mas isso não é um problema, pois pode ser dividido em vários blocos @(...)>>target.file que estão abaixo do limite. Mas sugiro rodar através de upx --brute 7za.exe , o que faz com que o arquivo exe tenha menos de 300kB de tamanho.

Fontes

por 19.06.2015 / 13:53
0

Você pode criar um arquivo zip a partir de um arquivo em lotes. Isso pode ser feito usando o código do software Shell.Application no Microsoft Windows, e isso pode ser feito usando uma linha de comando, mas é necessário algum código adicional. por exemplo, A resposta de Ansgar Wiechers à pergunta de user2868186 contém código (próximo ao final) que parece sólido. Como alternativa, a página de Rob Vanderwoude no VBS também mostra uma solução.

Você pode não gostar da ideia de ter essas 8 a 12 linhas (quantidade estimada) de VBScript. Bem, esse é o melhor método disponível que eu encontrei para automatizar as coisas, contando com a menor quantidade de código adicionado ao MS Windows. Eu não acho que o MS Windows (pelo menos não a versão que você está pedindo) forneceu uma maneira de fazer isso com menos código.

No entanto, se você for adicionar esse código regularmente, provavelmente desejará fazer o download, em vez de digitá-lo mais de uma vez. E se você estiver baixando, eu sugiro que você também esteja baixando algum outro código, como o 7-Zip ou o Info-Zip. O 7-Zip pode demorar um pouco mais para aprender como usá-lo na linha de comando, mas eu tive sucesso com isso. E se você não fizer isso mais de uma vez, provavelmente essa é outra razão pela qual adicionar software uma vez seria provavelmente uma boa solução a longo prazo (investimento de tempo mínimo, pagamento a longo prazo). Eu entendo que usar tal software não é exatamente o que você pediu, mas eu estou levantando isso de qualquer maneira, porque eu sugiro realmente considerar se isso acaba sendo a melhor solução.

Em relação à sua terceira etapa, coloque o seguinte em um arquivo em lote:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) echo %mydate% Observe que o comando FOR mostrado é destinado a ser executado a partir de um arquivo em lotes. A tentativa de executar exatamente o mesmo comando fora de um arquivo em lotes também não funcionará. Eu testei no Win7 SP1. Eu não tenho um servidor 2003 R2 à mão para testar isso, mas estou supondo que essa abordagem funcionará bem para você.

Dou crédito a resposta de Jay à pergunta de Rory sobre o tempo como base para essa abordagem.

    
por 16.05.2015 / 10:05