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.