sexta-feira, 20 de julho de 2018

Backup Incremental e Diferencial via PowerShell

Olá pessoal!

Muito tempo sem postar nada aqui, mas hoje resolvi voltar com uma dica para fazer backup de arquivos.

Basicamente existem diversas formas de se fazer isso, onde eu trabalho tínhamos um script que utilizava o comando robocopy para copiar apenas os arquivos modificados no último dia (/maxage:1), mas isso deixa algumas brechas, como por exemplo, arquivos copiados mantém a data de modificação da origem, podendo ficar de fora deste backup.

O comando antigo desenvolvido pelo meu colega era mais ou menos o seguinte, caso alguém precise:

$s1 = ("{0:yyyy-MM-dd}-arquivos-alterados-diariamente" -f (Get-Date))
cd E:\origem\
mkdir F:\destino\$s1 -Force
robocopy E:\origem F:\destino\$s1 /sec /e /maxage:1 /zb /r:3 /w:30 /v /eta /log:F:\destino\$s1\log_robocopy_externo.log

Funciona muito bem, só as vezes é um pouco difícil de encontrar o arquivo desejado porque você precisa lembrar o dia em que ele foi modificado, ou usar a busca e aguardar...

Pra resolver isso, criei o seguinte script, que ainda não testei em produção, apenas localmente, mas acredito que vai funcionar muito bem, segue:

## Copia diretórios e arquivos de um local (Origem) para o outro (Destino)
## No caso do arquivo já existir, copia apenas se o arquivo foi modificado, criando um novo arquivo com a data da cópia no início
## Criado em 2018-07-20 por Bolívar Butzke
## dicasdobolivar.blogspot.com
$data_atual = ("{0:yyyy-MM-dd}" -f (Get-Date))
$Source = "F:\testescript"
$Destination = "F:\bkp_testescript"
# Getting Files/Folders from Source
# Obtendo arquivos e pastas da origem
$SrcEntries = Get-ChildItem $Source -Recurse
# Parsing the folders and Files
# Separando os Diretórios e Arquivos
$Srcfolders = $SrcEntries | Where-Object{$_.PSIsContainer}
$SrcFiles = $SrcEntries | Where-Object{!$_.PSIsContainer}
# Formas de pegar apenas os arquivos modificados em um período, deixei de exemplo mas não uso mais porque arquivos copiados mantém data de modificação e não entravam no backup
#$SrcFilesUpdatedYesterday = $SrcFiles | Where{$_.LastWriteTime -ge (get-date).AddDays(-1)}
#$SrcFilesUpdated1MinuteAgo = $SrcFiles | Where{$_.LastWriteTime -ge (get-date).AddMinutes(-1)}
# Checking for Folders that are in Source, but not in Destination
# Cria diretórios no Destindo igual a Origem
foreach($folder in $Srcfolders)
{
$SrcFolderPath = $source -replace "\\","\\" -replace "\:","\:"
$DesFolder = $folder.Fullname -replace $SrcFolderPath,$Destination
if(!(test-path $DesFolder))
{
# Diretório ausente, cria ele
Write-Host "Diretório $DesFolder ausente. Criando ele!"
new-Item $DesFolder -type Directory | out-Null
}
}
# Copia os arquivos novos e modificados, adicionando a data atual no início do nome do arquivo modificado
foreach($arquivo in $SrcFiles)
{
$SrcFullname = $arquivo.fullname
$SrcFilePath = $Source -replace "\\","\\" -replace "\:","\:"
$DesFile = $SrcFullname -replace $SrcFilePath,$Destination
Write-Host "Testando se o arquivo $Desfile existe..."
# Verifica se o arquivo existe no destino
if(test-Path $Desfile)
{
#existe, compara data de modificação
$SrcDate = get-Item $SrcFullname | foreach-Object{$_.LastWriteTimeUTC}
$DesDate = get-Item $DesFile | foreach-Object{$_.LastWriteTimeUTC}
# -gt = Greater than
if($SrcDate -gt $DesDate)
{
# muda nome do arquivo que foi modificado / add data no início
$DesDirectory = $arquivo.Directory -replace $SrcFilePath,$Destination
$DesFileModified = $DesDirectory +"\"+ $data_atual + "_" + $arquivo.Name
#copia o arquivo com novo nome (versionamento)
Write-Host "Arquivo $arquivo.Name foi modificado, copiando para $DesFileModified"
copy-Item -path $SrcFullName -dest $DesFileModified -force
}
}
else
{
# arquivo não existe, copia o arquivo para o destino
Write-Host "$SrcFullname é novo, copiando para $DesFile"
copy-Item -path $SrcFullName -dest $DesFile -force
}
}
# Fontes de Inspiração:
# - https://ss64.com/ps/syntax-compare.html
# - https://stackoverflow.com/questions/677789/powershell-copy-item-but-only-copy-changed-files
E por hoje é só, até o futuro!

Nenhum comentário:

Postar um comentário