Automatizando uma tarefa de backup de pasta (zipar, mover e renomear de acordo com a convenção de nomenclatura)

Automatizando uma tarefa de backup de pasta (zipar, mover e renomear de acordo com a convenção de nomenclatura)

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 a etapa 2:

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

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

Quaisquer ideias serão muito apreciadas!

Responder1

Já que você começou a considerar o 7-zip nos comentários da outra resposta, eis como 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

Observe que isso é essencialmente uma linha se você incorporar as variáveis ​​de origem e destino. O par pushd/ popdexiste para que o contexto não mude caso você esteja fazendo vários backups em um lote. %date%é um embutido.

Não acho razoável querer 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 exclusão da ferramenta colocando o código acima backup_stuff.bate copiando 7za.exepróximo ao arquivo nomeado backup_stuff.bat-7za.exee então você só precisa substituir 7zapor %~dp0\backup_stuff.bat-7zapara fazer referência exatamente a esse arquivo. Isso deve transmitir a mensagem de que há uma dependência externa aqui...

Alternativamente, se você quiser ser realmente paranóico, basta incorporar o 7zip no arquivo em lote :)

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

goto deps

:exec
pushd "%SOURCE%" && "%TEMP%\7za" 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%\7za.exe.b64
certutil -decode -f %TEMP%\7za.exe.b64 %TEMP%\7za.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 (...), descobri que era em torno de 370kB (aproximadamente 5.000 linhas de b64). A base64 original do 7-zip tinha 800kB, mas isso não é nada demais, porque pode ser dividido em vários @(...)>>target.fileblocos que estão abaixo do limite. Mas sugiro que você execute upx --brute 7za.exeo que torna o arquivo exe com tamanho inferior a 300kB.

Fontes

Responder2

Você pode criar um arquivo zip a partir de um arquivo em lote. Isso pode ser feito usando o código do software Shell.Application no Microsoft Windows e pode ser feito usando uma linha de comando, mas é necessário algum código adicional. por exemplo,Resposta de Ansgar Wiechers à pergunta do usuário2868186contém código (perto da parte inferior) que parece sólido. Como uma alternativa,Página de Rob Vanderwoude na VBStambém mostra uma solução.

Você pode não gostar da ideia de precisar de 8 a 12 linhas (quantidade estimada) de VBScript. Bem, esse é o melhor método disponível que encontrei para automatizar as coisas enquanto confio na menor quantidade de código adicionado ao MS Windows. Não acho que o MS Windows (pelo menos não a versão que você está solicitando) tenha fornecido uma maneira de fazer isso com menos código.

No entanto, se você adicionar esse código regularmente, provavelmente desejará baixá-lo, em vez de digitá-lo mais de uma vez. E se você estiver baixando, sugiro que você também baixe algum outro código, como 7-Zip ou Info-Zip. O 7-Zip pode levar mais algum tempo para aprender como usá-lo na linha de comando, mas tive sucesso com ele. E se você não fizer isso mais de uma vez, provavelmente esse é outro motivo pelo qual adicionar software uma vez provavelmente seria uma boa solução a longo prazo (investimento mínimo de tempo, retorno a longo prazo). Entendo que usar esse software não é exatamente o que você pediu, mas estou trazendo isso à tona de qualquer maneira, porque sugiro realmente considerar se essa será a melhor solução.

Em relação à 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 deve ser executado a partir de um arquivo em lote. Tentar executar exatamente o mesmo comando fora de um arquivo em lote também não funcionará. Testei no Win7 SP1. Não tenho um servidor 2003 R2 à mão para testar isso, mas acho que essa abordagem funcionará bem para você.

Venho por meio deste creditarA resposta de Jay à pergunta de Rory sobre o tempocomo base para esta abordagem.

informação relacionada