Backupator - uma brincadeira para praticar DOS
HΓ‘ alguns anos atrΓ‘s atrΓ‘s comecei a escrever um script para automatizar o Backup de alguns arquivos do meu notebook para meu hd externo.
Fiz todo o desenvolvimento em DOS, para praticar os cΓ³digos de script. Infelizmente nΓ£o consegui me furtar de usar powershell em alguns momentos do cΓ³digo, como vocΓͺ poderΓ‘ perceber.
O script estΓ‘ funcional. Para mais praticidade, realizei o agendamento de tarefas, ferramenta nativa do windows, para que sempre que meu hd externo for conectado o script seja executado e faΓ§a o backup automaticamente, isso Γ© bem interessante.
Ainda nΓ£o subi o projeto para o github, quem sabe eu faΓ§a isso futuramente. Por enquanto, segue o cΓ³digo pra quem se interessar.
Captura de tela do script em funcionamento:

Backupator.bat
@echo off
color 0A
title <nul & title BACKUPATOR~~~ 0.0.1 >nul 2>&1
::mode con:cols=70 lines=1000
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion
set /a "off = 0"
cls
call logo.bat
::::::::::::::: ROTINA PRINCIPAL :::::::::::::::
:principal
echo.
::ping 127.0.0.1 -n 1 >nul 2>&1
::echo ββββββ
::ping 127.0.0.1 -n 1 >nul 2>&1
::echo β
::ping 127.0.0.1 -n 1 >nul 2>&1
echo β O que vocΓͺ deseja?
ping 127.0.0.1 -n 1 >nul 2>&1
echo β
ping 127.0.0.1 -n 1 >nul 2>&1
echo β 1 - Ir para o inΓcio
ping 127.0.0.1 -n 1 >nul 2>&1
echo β 2 - Exibir backups programados
ping 127.0.0.1 -n 1 >nul 2>&1
echo β 3 - Programar novo backup
ping 127.0.0.1 -n 1 >nul 2>&1
echo β 4 - Fazer backups programados agora
ping 127.0.0.1 -n 1 >nul 2>&1
echo β 5 - Ajuda
ping 127.0.0.1 -n 1 >nul 2>&1
echo β 6 - Sair
echo.
color 74
::set /p menu= ^> Digite a opΓ§Γ£o desejada:
choice /c:1234567 /n /t 30 /d 7 /m "βββ Selecione a opΓ§Γ£o desejada:"
IF [%ERRORLEVEL%] == [1] (
cls
call logo.bat )
IF [%ERRORLEVEL%] == [2] call :lertxt
IF [%ERRORLEVEL%] == [3] call :novo
IF [%ERRORLEVEL%] == [4] (
cls
call fazerbackup.bat )
IF [%ERRORLEVEL%] == [5] call :ajuda
IF [%ERRORLEVEL%] == [6] goto :sair
IF [%ERRORLEVEL%] == [7] (
set /a "off+=1"
IF [!off!] GTR [10] ( goto :sair ) else (
cls
call logo.bat ))
goto :principal >nul 2>&1
:: LΓ O TXT :: GRAVA NO ARRAY :: EXIBE NA TELA ::
:lertxt
cls
for /f "eol=# tokens=1-9 delims=? usebackq" %%I in (programados.txt) do (
::call :array %%~I %%~J %%~fK %%~fL %%~M %%~N %%~O %%~P %%~Q
set arq[%%~I].ID=%%~I
set arq[%%~I].Ativo=%%~J
set arq[%%~I].PastaOrigem=%%~fK
set arq[%%~I].PastaDestino=%%~fL
set arq[%%~I].Serial=%%~M
set arq[%%~I].DataRegistro=%%~N
set arq[%%~I].HoraRegistro=%%~O
set arq[%%~I].DataUltimoBackup=%%~P
set arq[%%~I].HoraUltimoBackup=%%~Q
)
set /a "y = 1" >nul 2>&1
cls
:exibe
if defined arq[%y%].ID (
if [%y%] == [1] (
call echo.
call echo β SΓO OS BACKUPS PROGRAMADOS: )
call echo.
call echo β ID: %%arq[%y%].ID%%
call echo β Ativo: %%arq[%y%].Ativo%%
call echo β ORIGEM: %%arq[%y%].PastaOrigem%%
call echo β DESTINO: %%arq[%y%].PastaDestino%%
call echo β SERIAL: %%arq[%y%].Serial%%
call echo β ATIVO DESDE: %%arq[%y%].DataRegistro%% %%arq[%y%].HoraRegistro%%
call echo β ΓLTIMO BACKUP: %%arq[%y%].DataUltimoBackup%% %%arq[%y%].HoraUltimoBackup%%
set /a "y+=1"
goto :exibe >nul 2>&1 ) else (
if [%y%] == [1] (
call echo.
call echo β NΓO HΓ BACKUPS PROGRAMADOS. ) )
exit /b
::goto :principal >nul 2>&1
::::::::::::: PROGRAMAR NOVO :::::::::::::
:novo
cls
echo.
echo β Escolha a pasta origem.
set "psCommand="(new-object -COM 'Shell.Application')^.BrowseForFolder(0,'Escolha a pasta que deseja guardar.',0,0).self.path""
set "psCommand="(new-object -COM 'Shell.Application')^.BrowseForFolder(0,'Escolha a pasta da origem.',0,0).self.path""
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "pastaorigem="%%I""
echo.
echo β Escolha a pasta destino.
set "psCommand="(new-object -COM 'Shell.Application')^.BrowseForFolder(0,'Escolha a pasta do destino.',0,0).self.path""
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "pastadestino="%%I""
setlocal enabledelayedexpansion
IF [%pastaorigem%] == [] (
echo.
echo β ERRO: VocΓͺ nΓ£o selecionou a origem!
echo.
IF [%pastadestino%] == [] (
echo β ERRO: VocΓͺ nΓ£o selecionou o destino!
echo. )
exit /b
) else (
echo.
echo β Pasta Origem: %pastaorigem% )
IF [%pastadestino%] == [] (
echo.
echo β ERRO: VocΓͺ nΓ£o selecionou o destino!
echo.
exit /b
) else (
echo.
echo β Pasta Destino: %pastadestino% )
IF [%pastadestino%] == [%pastaorigem%] (
echo.
echo β ERRO: A origem e o destino devem ser diferentes!
echo.
exit /b
)
::::: CONTA OS JΓ GRAVADOS NO TXT :::::
set /a z=1 >nul 2>&1
for /f "eol=# tokens=1-9 delims=? usebackq" %%I in (programados.txt) do (
set /a z+=1
)
::::: ESTIPULA VARIAVEIS :::::
set ativo=Sim
set dataregistro=%date:~0,2%/%date:~3,2%/%date:~6,2%
set horaregistro=%time:~0,2%h%time:~3,2%min%time:~6,2%seg
set disco=%pastadestino:~1,2%
set capturadisco="wmic logicaldisk get Caption,VolumeSerialNumber | find "%disco%""
for /f "tokens=1,2" %%P in ( '%capturadisco%' ) do set "caption=%%~P" && set serial=%%~Q >nul 2>&1
::::: GRAVA NO ARRAY :::::
set arq[%z%].ID=%z%
set arq[%z%].Ativo=%ativo%
set arq[%z%].PastaOrigem=%pastaorigem%
set arq[%z%].PastaDestino=%pastadestino%
set arq[%z%].Serial=%serial%
set arq[%z%].DataRegistro=%dataregistro%
set arq[%z%].HoraRegistro=%horaregistro%
set arq[%z%].DataUltimoBackup=00/00/0000
set arq[%z%].HoraUltimoBackup=00h00min00seg
::::: SALVA NO ARQUIVO :::::
:::::call echo %%arq[%z%].ID%%?%%arq[%z%].Ativo%%?%%arq[%z%].PastaOrigem%%?%%arq[%z%].PastaDestino%%?%%arq[%z%].Serial%%?%%arq[%z%].DataRegistro%%?%%arq[%z%].HoraRegistro%%?%%arq[%z%].DataUltimoBackup%%?%%arq[%z%].HoraUltimoBackup%%>>programados.txt:::::
:::::call echo. >>programados.txt
(call echo %%arq[%z%].ID%%?%%arq[%z%].Ativo%%?%%arq[%z%].PastaOrigem%%?%%arq[%z%].PastaDestino%%?%%arq[%z%].Serial%%?%%arq[%z%].DataRegistro%%?%%arq[%z%].HoraRegistro%%?%%arq[%z%].DataUltimoBackup%%?%%arq[%z%].HoraUltimoBackup%%)>>programados.txt
echo.
echo β InstruΓ§Γ΅es gravadas com sucesso!
echo.
exit /b
:ajuda
cls
echo.
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo β Ajuda.
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo β BACKUPATOR Γ© um programa que automatiza seus backups.
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo β Programe um novo backup, escolha o diretΓ³rio de origem e de destino.
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo β FaΓ§a a importaΓ§Γ£o do arquivo "tarefa.xml"
ping 127.0.0.1 -n 1 >nul 2>&1
echo β no Agendador de Tarefas do Windows.
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo β Assim, toda vez que conetar sua mΓdia externa
ping 127.0.0.1 -n 1 >nul 2>&1
echo β o backup serΓ‘ realizado automaticamente.
ping 127.0.0.1 -n 1 >nul 2>&1
echo.
echo β Deixe a preocupaΓ§Γ£o de lado e nunca mais perca seus arquivos.
echo.
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
set /p voltar= βββ Aperte a tecla [ENTER] para voltar.
cls
call logo.bat
exit /b
:sair
cls
echo.
echo ββββ βββ ββββββ ββ βββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββββββ ββββββ ββββ ββ βββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββ ββββββ βββ βββ β ββββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββββ βββββββββ ββββ βββββββ ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ βββ ββ βββββ βββββ βββββ ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββββββ ββ βββββ ββ β ββ ββ ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ β β ββ β β β β ββ ββ
echo β β β β β β ββ β
::echo β β ββ β β β
::echo β β
echo β ββ ββββββ βββ βββββββββ ββββββ ββββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββ ββββββββ βββββββββ β βββ ββββββ ββββββ β βββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ ββββββββ βββββββ βββ β ββββ ββββββ ββββββ βββ β
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ βββββββββββ βββββββββββ ββββ β βββ ββββββββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββββββ ββββ β β ββ ββββ ββββ β β βββββββββββ ββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββ β β ββββ β β ββ ββββ β ββ β ββββββ β ββ ββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββ β β ββ β β ββ β β β β ββ ββ β ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ β β ββ β β β β β β β ββ β
echo β β β β β β
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo.
echo POR GUILHERME MIGLIORINI
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo V. 0.0.1
echo.
ping 127.0.0.1 -n 1 >nul 2>&1
echo Copyleft 2022
echo.
color 0A
echo.
ping 127.0.0.1 -n 3 >nul 2>&1
goto :eof
goto :eof
fazerbackup.bat
@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion
set /a "z = 1" >nul 2>&1
set /a "confirma = 0" 2>&1
for /f "eol=# tokens=1-9 delims=? usebackq" %%I in (programados.txt) do (
::call :array %%~I %%~J %%~fK %%~fL %%~M %%~N %%~O %%~P %%~Q
set arq[%%~I].ID=%%~I
set arq[%%~I].Ativo=%%~J
set arq[%%~I].PastaOrigem=%%~fK
set arq[%%~I].PastaDestino=%%~fL
set arq[%%~I].Serial=%%~M
set arq[%%~I].DataRegistro=%%~N
set arq[%%~I].HoraRegistro=%%~O
set arq[%%~I].DataUltimoBackup=%%~P
set arq[%%~I].HoraUltimoBackup=%%~Q )
:backupator
setlocal enabledelayedexpansion
if defined arq[%z%].ID (
if [!arq[%z%].Ativo!] == [Sim] (
set serial=!arq[%z%].Serial!
set origem=!arq[%z%].PastaOrigem!
set destino=!arq[%z%].PastaDestino!
set variavel="wmic logicaldisk get Caption,VolumeSerialNumber | find "!serial!""
for /f "tokens=1,2" %%1 in ( '!variavel!' ) do (
set disco=%%~1
ping 127.0.0.1 -n 1 >nul 2>&1
robocopy.exe "!origem!" "!destino!" /E /LOG+:log.txt >nul 2>&1
set /a "confirma+=1"
if [%z%] == [1] (
call echo.
call echo β SERΓO REALIZADOS OS SEGUINTES BACKUPS: )
call echo.
call echo β ID: !arq[%z%].ID!
call echo β Ativo: !arq[%z%].Ativo!
call echo β ORIGEM: !arq[%z%].PastaOrigem!
call echo β DESTINO: !arq[%z%].PastaDestino!
call echo β SERIAL: !arq[%z%].Serial!
call echo β ATIVO DESDE: !arq[%z%].DataRegistro! !arq[%w%].HoraRegistro!
call echo β ΓLTIMO BACKUP: !arq[%z%].DataUltimoBackup! !arq[%w%].HoraUltimoBackup!
)
)
set /a "z+=1" >nul 2>&1
goto :backupator >nul 2>&1 )
if [%z%] == [1] (
echo.
echo β ERRO: NΓ£o hΓ‘ backups programados.
exit /b )
if [%confirma%] == [0] (
echo.
echo β ERRO: O dispotivo precisa estar conectado.
powershell -Command "& {Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; $notify = New-Object System.Windows.Forms.NotifyIcon; $notify.Icon = [System.Drawing.SystemIcons]::Information; $notify.Visible = $true; $notify.ShowBalloonTip(0, 'Script de Backup', 'O dispositivo nΓ£o estΓ‘ conectado.', [System.Windows.Forms.ToolTipIcon]::None)}"
exit /b ) else (
powershell -Command "& {Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; $notify = New-Object System.Windows.Forms.NotifyIcon; $notify.Icon = [System.Drawing.SystemIcons]::Information; $notify.Visible = $true; $notify.ShowBalloonTip(0, 'Script de Backup', 'ConteΓΊdo salvo no HD Externo. Verifique o log para mais informaΓ§Γ΅es.', [System.Windows.Forms.ToolTipIcon]::None)}"
exit /b )
goto :eof
initscript.bat
@echo off
START /MIN CMD.EXE /C C:\Users\...\BACKUPATOR\fazerbackup.bat >nul 2>&1
exit >nul 2>&1
logo.bat
cls
echo.
echo ββββ βββ ββββββ ββ βββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββββββ ββββββ ββββ ββ βββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββ ββββββ βββ βββ β ββββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββββ βββββββββ ββββ βββββββ ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ βββ ββ βββββ βββββ βββββ ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββββββ ββ βββββ ββ β ββ ββ ββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ β β ββ β β β β ββ ββ
::ping 127.0.0.1 -n 1 >nul 2>&1
::echo β β β β β β ββ β
::echo β β ββ β β β
::echo β β
ping 127.0.0.1 -n 1 >nul 2>&1
echo β ββ ββββββ βββ βββββββββ ββββββ ββββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββ ββββββββ βββββββββ β βββ ββββββ ββββββ β βββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ ββββββββ βββββββ βββ β ββββ ββββββ ββββββ βββ β
ping 127.0.0.1 -n 1 >nul 2>&1
echo βββ βββββββββββ βββββββββββ ββββ β βββ ββββββββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββββββ ββββ β β ββ ββββ ββββ β β βββββββββββ ββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββ β β ββββ β β ββ ββββ β ββ β ββββββ β ββ ββββ
ping 127.0.0.1 -n 1 >nul 2>&1
echo ββββ β β ββ β β ββ β β β β ββ ββ β ββ
ping 127.0.0.1 -n 1 >nul 2>&1
::echo βββ β β ββ β β β β β β β ββ β
::ping 127.0.0.1 -n 1 >nul 2>&1
echo β β β β β β
exit /b
tarefa.xml
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2022-05-07T13:01:17.3316439</Date>
<Author>...Autor...</Author>
<URI>\Backupator</URI>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><QueryList><Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational"><Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=2003]]</Select></Query></QueryList></Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>...Id do UsuΓ‘rio...</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Users\...\BACKUPATOR\initscript.bat</Command>
<WorkingDirectory>C:\Users\...\BACKUPATOR\</WorkingDirectory>
</Exec>
</Actions>
</Task>