Backups archivieren Alte löschen

Backups archivieren Alte löschen

Backups muss man archivieren, jedoch mit Sicherheit nicht ewig behalten. Daher werden 7 Tage alle täglichen Backups aufbewahrt, es werden 20 WochenBackups behalten und 12 MonatsBackups.

$logfile = "D:\Monitoring\Status\Backup_archivieren_Status.txt"
function logit($zeile)
    {
    
    $zeitstempel = "{0:yyyy-MM-dd HH:mm:ss}" -f (Get-Date)
    $zeitstempel + " " + $zeile | Out-File -Append -FilePath $logfile

    }
    
$folders =@("Unterordner1","Unterordner2","Unterordner3","Unterordner4")
$zielpfad = "\\server\Daten\Backup\"
$lokaleBackups = "D:\Backup\"


logit "######### STARTE BACKUP KOPIEREN #########"

foreach($folder in $folders)
    {
    if(!(Test-Path "$zielpfad\$folder" ))
        {
        logit "neuer Backupzielordner `"$zielpfad\$folder`" wird erstellt"
        New-Item -ItemType Directory -Path "$zielpfad\$folder" 
        }
    $quelle = ls $lokaleBackups\$folder
    $ziel   = ls $zielpfad\$folder
    
    foreach($quellverzeichnis in $quelle)
        {
        if(!(Test-Path "$zielpfad\$folder\$($quellverzeichnis.name)"))
            {
            logit "######### STARTE KOPIE FÜR $folder #########"
            Copy-Item $quellverzeichnis.FullName "$zielpfad\$folder" -Recurse
            logit "kopiere $quellverzeichnis nach $zielpfad\$folder"
            logit "######### ENDE   KOPIE FÜR $folder #########"
            }
        else
            {
            logit "Verzeichnis $zielpfad\$folder schon vorhanden"
            }
        }
    }

logit "######### STARTE ALTE BACKUPS LÖSCHEN AUF FILER #########"
##Backups aufräumen auf Filer !
foreach($folder in $folders)
    {
    logit "#########  FÜR $folder #########"
    $month = 0
    $wochentagFuerWochenBackup = 0
    $tageDieNichtGeloeschtwerdenSollen = 7
    $anzahlzuBehaltenderWochenBackups = 20
    $anzahlzuBehaltenderMonatsBackups = 12
        
    $FileList = ls "$zielpfad\$folder"

    logit $folder

    foreach($File in ($FileList | Sort-Object LastWriteTime  -Descending ))
        {
        if(! ($File.LastWriteTime -is [datetime])){continue}
        if($File.LastWriteTime -ge (Get-Date).AddDays(0-$tageDieNichtGeloeschtwerdenSollen))
            {
            logit "$($File.LastWriteTime) $($File.fullname) wird nicht gelöscht da noch nicht $tageDieNichtGeloeschtwerdenSollen alt ist"
            continue
            }
        if(($File.LastWriteTime.DayOfWeek -eq $wochentagFuerWochenBackup) -and ($anzahlzuBehaltenderWochenBackups -gt 0))
            {
            logit "$($File.LastWriteTime) $($File.fullname) wird nicht gelöscht da es ein WochenBackup ist $($File.LastWriteTime.DayOfWeek)" 
            $anzahlzuBehaltenderWochenBackups-- # = $anzahlzuBehaltenderWochenBackups -1
            continue
            }
        if(($anzahlzuBehaltenderMonatsBackups -gt 0) -and ($anzahlzuBehaltenderWochenBackups -eq 0) )
            {
            if($month -eq 0  -or ($month -ne $File.LastWriteTime.Month ) )
                {
                $month = $File.LastWriteTime.Month 
                logit "$($File.LastWriteTime) $($File.fullname) wird nicht gelöscht da es ein Monatsbackup ist ; anzahl $anzahlzuBehaltenderMonatsBackups"
                $anzahlzuBehaltenderMonatsBackups-- # = $anzahlzuBehaltenderWochenBackups -1
                continue
                }
            }
        logit "lösche $($File.FullName)"
        Remove-Item -LiteralPath $File.FullName -Confirm:$false -Recurse 
        }

}




logit "######### STARTE ALTE BACKUPS LÖSCHEN AUF LOKALEM LAUFWERK #########"

##Backups aufräumen auf lokaler HDD !
foreach($folder in $folders)
    {
    logit "#########  FÜR $folder #########"
    $month = 0
    $wochentagFuerWochenBackup = 0
    $tageDieNichtGeloeschtwerdenSollen = 7
    $anzahlzuBehaltenderWochenBackups = 1
    $anzahlzuBehaltenderMonatsBackups = 1
        
    $FileList = ls "$lokaleBackups\$folder"

    logit $folder

    foreach($File in ($FileList | Sort-Object LastWriteTime  -Descending ))
        {
        if(! ($File.LastWriteTime -is [datetime])){continue}
        if($File.LastWriteTime -ge (Get-Date).AddDays(0-$tageDieNichtGeloeschtwerdenSollen))
            {
            logit "$($File.LastWriteTime) $($File.fullname) wird nicht gelöscht da noch nicht $tageDieNichtGeloeschtwerdenSollen Tage alt ist"
            continue
            }
        if(($File.LastWriteTime.DayOfWeek -eq $wochentagFuerWochenBackup) -and ($anzahlzuBehaltenderWochenBackups -gt 0))
            {
            logit "$($File.LastWriteTime) $($File.fullname) wird nicht gelöscht da es ein WochenBackup ist $($File.LastWriteTime.DayOfWeek)" 
            $anzahlzuBehaltenderWochenBackups-- # = $anzahlzuBehaltenderWochenBackups -1
            continue
            }
        if(($anzahlzuBehaltenderMonatsBackups -gt 0) -and ($anzahlzuBehaltenderWochenBackups -eq 0) )
            {
            if($month -eq 0  -or ($month -ne $File.LastWriteTime.Month ) )
                {
                $month = $File.LastWriteTime.Month 
                logit "$($File.LastWriteTime) $($File.fullname) wird nicht gelöscht da es ein Monatsbackup ist ; anzahl $anzahlzuBehaltenderMonatsBackups"
                $anzahlzuBehaltenderMonatsBackups-- # = $anzahlzuBehaltenderWochenBackups -1
                continue
                }
            }
        logit "lösche $($File.FullName)"
        Remove-Item -LiteralPath $File.FullName -Confirm:$false -Recurse 
        }

}

logit "######### ENDE  BACKUP KOPIEREN #########"