Automatiser les sauvegardes sous Windows avec PowerShell

Les données sont aujourd’hui l’un des actifs les plus précieux. Que vous soyez développeur, administrateur système ou utilisateur avancé, automatiser la sauvegarde de vos fichiers critiques évite bien des pertes. Dans cet article, nous présentons un script PowerShell complet qui crée des sauvegardes horodatées (format .zip), consigne les opérations dans un log, supprime automatiquement les sauvegardes trop anciennes et s’intègre parfaitement au Planificateur de tâches Windows.

Pourquoi automatiser les sauvegardes ?

  • FiabilitĂ© : moins d’erreurs humaines (oublis).
  • Restauration rapide : retrouver une version antĂ©rieure facilement.
  • ConformitĂ© & retention : respecter des politiques de conservation.
  • FacilitĂ© d’évolutivitĂ© : ajouter plus de sources sans intervention manuelle.

Fonctionnalités du script proposé

  • Copie fiable des dossiers sources (via robocopy).
  • Compression en .zip (optionnelle).
  • Journalisation dĂ©taillĂ©e (backup.log).
  • Politique de rĂ©tention : suppression des sauvegardes plus anciennes qu’un nombre de jours configurable.
  • CapacitĂ© Ă  sauvegarder localement ou vers un partage rĂ©seau (avec adaptations).

Script PowerShell

Place ce script dans un fichier AutoBackup.ps1. Modifie la section CONFIGURATION selon ton environnement.

<#
.SYNOPSIS
  Backup automatique : copie, zip, log, retention.
#>

#region CONFIGURATION
$Sources = @(
    "C:\Users\Public\Documents",
    "C:\Projects\MyApp"
)
$DestinationRoot = "D:\Backups\Daily"
$Compress = $true
$RetentionDays = 30
$LogFile = Join-Path $DestinationRoot "backup.log"
#endregion

function Write-Log {
    param($Message, $Level = "INFO")
    $line = "{0} [{1}] {2}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Level, $Message
    $line | Out-File -FilePath $LogFile -Append -Encoding UTF8
    Write-Output $line
}

# Préparation
if (-not (Test-Path -Path $DestinationRoot)) { New-Item -ItemType Directory -Path $DestinationRoot -Force | Out-Null }
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$backupName = "backup_$timestamp"
$backupFolder = Join-Path $DestinationRoot $backupName

Write-Log "=== START BACKUP: $backupName ==="

try {
    New-Item -ItemType Directory -Path $backupFolder -Force | Out-Null
    Write-Log "Created folder: $backupFolder"

    foreach ($src in $Sources) {
        if (-not (Test-Path -Path $src)) {
            Write-Log "Source missing: $src" "WARN"
            continue
        }
        $destSub = Join-Path $backupFolder (Split-Path $src -Leaf)
        Write-Log "Copying: $src -> $destSub"
        robocopy $src $destSub /MIR /COPY:DAT /R:3 /W:5 | Out-Null
        if ($LASTEXITCODE -ge 8) { Write-Log "Robocopy failed (code $LASTEXITCODE) for $src" "ERROR" }
        else { Write-Log "Robocopy finished for $src (code $LASTEXITCODE)" }
    }

    if ($Compress) {
        $zipPath = Join-Path $DestinationRoot ($backupName + ".zip")
        Write-Log "Creating zip: $zipPath"
        if (Test-Path $zipPath) { Remove-Item $zipPath -Force }
        Compress-Archive -Path (Join-Path $backupFolder '*') -DestinationPath $zipPath -Force
        Write-Log "Compression complete: $zipPath"
        Remove-Item -Path $backupFolder -Recurse -Force
        Write-Log "Removed temp folder: $backupFolder"
    }

    Write-Log "Backup succeeded: $backupName"
}
catch {
    Write-Log ("ERROR during backup: " + $_.Exception.Message) "ERROR"
}

# Retention
try {
    Write-Log "Retention: removing backups older than $RetentionDays days."
    $cutoff = (Get-Date).AddDays(-$RetentionDays)

    Get-ChildItem -Path $DestinationRoot -Filter "backup_*.zip" -File -ErrorAction SilentlyContinue |
      Where-Object { $_.LastWriteTime -lt $cutoff } |
      ForEach-Object { Write-Log "Removing old zip: $($_.FullName)"; Remove-Item $_.FullName -Force -ErrorAction SilentlyContinue }

    Get-ChildItem -Path $DestinationRoot -Filter "backup_*" -Directory -ErrorAction SilentlyContinue |
      Where-Object { $_.LastWriteTime -lt $cutoff } |
      ForEach-Object { Write-Log "Removing old folder: $($_.FullName)"; Remove-Item $_.FullName -Recurse -Force -ErrorAction SilentlyContinue }

    Write-Log "Retention complete."
}
catch {
    Write-Log ("ERROR during retention: " + $_.Exception.Message) "ERROR"
}

Write-Log "=== END BACKUP: $backupName ===`n"

Déployer et automatiser

  1. Enregistrer le script C:\Scripts\AutoBackup.ps1
  1. Tester manuellement : PowerShell -NoProfile -File "C:\Scripts\AutoBackup.ps1" en tant qu’admin pour vérifier les logs et le zip généré.

Bonnes pratiques & extensions possibles

  • SĂ©curiser les sauvegardes : chiffrer l’archive ou utiliser BitLocker sur la destination.
  • Sauvegardes incrĂ©mentales : pour gagner de l’espace et du temps, envisager des solutions spĂ©cialisĂ©es (Veeam, Duplicati, etc.) ou utiliser des stratĂ©gies d’archive diff.
  • Notifications : envoyer un e-mail ou alerte après exĂ©cution (via SMTP/Send-MailMessage ou API).
  • Monitoring : surveiller l’espace disque de la destination et le statut des tâches planifiĂ©es.
  • Tests de restauration rĂ©guliers : une sauvegarde n’est utile que si on peut restaurer ; programme des tests pĂ©riodiques.

Ce script offre une base solide pour automatiser les sauvegardes sur Windows. Il est simple à adapter : ajouter ou retirer sources, modifier la rétention, activer/désactiver la compression, ou rediriger vers un partage réseau. Si tu veux, je peux :

  • l’adapter pour sauvegarder uniquement certains types de fichiers ;
  • ajouter envoi de notifications par mail ;
  • convertir la sortie en format JSON pour ingestion par un outil de monitoring.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *