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 sectionCONFIGURATIONselon 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
- Enregistrer le script
C:\Scripts\AutoBackup.ps1

- 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.