[PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Vous trouverez ici des scripts pour faciliter la gestion de votre ordinateur. Ils sont proposés tels quels par le rédacteur du message. La team ne vérifie pas la qualité de ces éléments et n'assure pas le support ni la maintenance. Vous les utilisez sous votre seule responsabilité.
Règles du forum
Pour les créateurs de scripts

Veuillez noter que les scripts que vous partagez ici sont proposés tels quels et la team ne vérifie pas leur qualité.
Nous vous rappelons que nous n'assurons ni le support ni la maintenance des scripts publiés.

Pour faciliter leur utilisation par les autres membres de la communauté, respectez ces consignes :
.
  • Utilisez les préfixes de langage pour taguer les messages.
  • Assurez-vous que vos scripts sont clairs et bien documentés
.
Merci de votre compréhension et de votre contribution.
Répondre
Avatar du membre
pboulanger
Administrateur du site
Administrateur du site
Messages : 1157
Enregistré le : mar. 17 mars 2020 11:49
A remercié : 141 fois
A été remercié : 143 fois
    Windows 10 Firefox

[PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Message par pboulanger »

Bonjour à tous

Ce script PowerShell, intitulé Sauvegarde-Miroir.ps1 , est conçu pour créer une sauvegarde de type miroir sur un disque externe.
On va utiliser un outil :"Robocopy"

Présentation de Robocopy

Robocopy (Robust File Copy) est un outil officiel de Microsoft, intégré nativement à Windows depuis Vista.
Il est conçu pour réaliser des copies et synchronisations de fichiers de manière fiable, rapide et robuste, même sur de gros volumes de données.

🔹 Ses principaux atouts
  • Tolérant aux interruptions : reprend là où il s’est arrêté en cas de problème.
  • Performant : peut utiliser plusieurs flux en parallèle (option /MT) pour accélérer la copie.
  • Flexible : permet de choisir entre simple copie, sauvegarde incrémentielle, ou mode miroir.
  • Fiable : gère correctement les erreurs, les fichiers verrouillés, les autorisations NTFS, etc.
🔹 Différence avec une copie classique

Une copie avec l’Explorateur Windows peut échouer en cas de fichier verrouillé ou de gros volumes.

Robocopy, lui, est conçu pour gérer ces cas et offrir un suivi détaillé grâce à ses logs.

🔹 Les usages typiques
  • Sauvegarde personnelle vers un disque externe.
  • Synchronisation régulière d’un dossier de travail.
  • Duplication de gros volumes de données pour archivage.
🔹 Attention au mode "miroir"

L’option /MIR crée une copie strictement identique à la source.
⚠️ Tout fichier supprimé dans la source sera également supprimé dans la destination.

Ce mode convient parfaitement à une logique de clone, mais pas pour conserver des archives.


Pré-requis pour utiliser le script Sauvegarde-Miroir.ps1
  • Un disque externe ou un support de sauvegarde disponible
  • Le disque doit être branché et reconnu par Windows (exemple : E: ou H:).
  • Vérifiez que la capacité est suffisante pour contenir toutes vos données à sauvegarder.
  • Création du dossier de sauvegarde sur le disque externe
    Exemple : H:\Sauvegardes\MonDossierSauvegarde
    Le dossier peut être créé manuellement via l’Explorateur Windows
  • Définition claire des chemins dans le script
    • $source = dossier à sauvegarder (ex. C:\Users\Jean)
    • $destination = dossier sur le disque externe (ex. H:\Sauvegardes\Jean)
    • $logfile = emplacement du fichier log (ex. H:\Sauvegardes\Mirror_Jean.log)
  • Droits d’accès
    L’utilisateur doit avoir les droits en lecture sur le dossier source et en écriture sur le disque externe.
    Pas besoin d’être administrateur, sauf si le dossier source contient des fichiers système protégés.
:!: Attention au mode miroir :!:
Tout fichier supprimé dans la source sera également supprimé dans la sauvegarde.

Ce script n’est pas une sauvegarde historique (il n’archive pas les anciennes versions).

Le code commenté

Il est à adapter en fonction de votre configuration

Code : Tout sélectionner

<#
.Version
	Nom du script : Sauvegarde-Miroir.ps1
    	Créateur      : PiB pour TEAM-AAZ
    	Version       : 1.1.0.1.a
    	Date          : Septembre 2025
    
.SYNOPSIS
 Script PowerShell de sauvegarde en mode "miroir".

.DESCRIPTION
 Ce script synchronise (clone) un dossier source vers un dossier cible.
 Le contenu de la destination sera identique à celui de la source :
 - Tout fichier ajouté ou modifié dans la source sera copié
 - Tout fichier supprimé dans la source sera aussi supprimé dans la destination

ATTENTION :
- C’est une synchronisation "miroir", pas une sauvegarde historique !
- Les fichiers supprimés à la source seront supprimés dans la copie.
#>

# Charger la librairie .NET pour afficher des messages graphiques
Add-Type -AssemblyName System.Windows.Forms

# -------------------------------------------------------------------
# 🔧 PARAMÈTRES À PERSONNALISER
# -------------------------------------------------------------------
# Chemin du dossier source (à sauvegarder)
$source      = "X:\Chemin\Vers\MonDossierSource"

# Chemin du dossier destination (ex. disque externe)
$destination = "Y:\Sauvegardes\MonDossierSauvegarde"

# Nom et emplacement du fichier log
$logfile     = "Y:\Sauvegardes\Mirror_Sauvegarde.log"
# -------------------------------------------------------------------

# Vérifie si le dossier cible existe, sinon le crée
if (-not (Test-Path $destination)) {
    New-Item -Path $destination -ItemType Directory -Force | Out-Null
}

# -------------------------------------------------------------------
# Lancement de Robocopy
# -------------------------------------------------------------------
# Options utilisées :
# /MIR    : mode miroir (ajoute/supprime pour correspondre à la source)
# /XJ     : ignore les jonctions (évite les boucles infinies)
# /R:2    : réessaie 2 fois si un fichier est verrouillé
# /W:5    : attend 5 secondes entre les tentatives
# /MT:16  : copie multi-thread (16 flux en parallèle, accélère la copie)
# /XA:O   : ignore les fichiers Cloud non présents localement (OneDrive, Dropbox, etc.)
# /UNILOG : génère un log en Unicode (UTF-16 LE BOM), plus fiable pour les caractères accentués
# -------------------------------------------------------------------

robocopy $source $destination /MIR /XJ /R:2 /W:5 /MT:16 /XA:O /UNILOG:$logfile
$exitCode = $LASTEXITCODE

# -------------------------------------------------------------------
# Conversion du log en UTF-8 BOM
# -------------------------------------------------------------------
# Robocopy écrit en Unicode (UTF-16).
# Pour rendre le log lisible dans TOUS les éditeurs (Notepad, VS Code, Notepad++),
# on le reconvertit automatiquement en UTF-8 avec BOM.
# -------------------------------------------------------------------
$content  = Get-Content -Path $logfile -Raw -Encoding Unicode
$utf8BOM  = New-Object System.Text.UTF8Encoding($true)  # $true => avec BOM
[System.IO.File]::WriteAllText($logfile, $content, $utf8BOM)

# -------------------------------------------------------------------
# Vérification du résultat et notification graphique
# Codes retour Robocopy :
# 0     = Rien à copier (déjà à jour)
# 1-3   = Succès (avec nouveaux fichiers / suppressions)
# >3    = Erreurs
# -------------------------------------------------------------------

if ($exitCode -le 3) {
    [System.Windows.Forms.MessageBox]::Show(
        "✅ Sauvegarde miroir terminée avec succès.`nLog : $logfile",
        "Sauvegarde-Miroir",
        [System.Windows.Forms.MessageBoxButtons]::OK,
        [System.Windows.Forms.MessageBoxIcon]::Information
    )
} else {
    [System.Windows.Forms.MessageBox]::Show(
        "⚠️ Erreurs détectées pendant la sauvegarde.`nConsultez le log : $logfile",
        "Sauvegarde-Miroir",
        [System.Windows.Forms.MessageBoxButtons]::OK,
        [System.Windows.Forms.MessageBoxIcon]::Error
    )
}


Ce que fait ce script


Ce script sauvegarde un dossier en mode miroir vers un disque externe. Il utilise Robocopy, l’outil officiel de Microsoft, robuste et fiable.
Les fichiers supprimés dans la source le seront aussi dans la sauvegarde → c’est un vrai clone.
Le script génère un fichier log en UTF-8 BOM (lisible partout) grâce à l’option /UNILOG et une petite conversion automatique.
Une fenêtre s’affiche à la fin pour indiquer succès ou erreurs.

👉 Les seules choses à personnaliser sont :
  • $source (ton dossier à sauvegarder)
  • $destination (ton dossier de sauvegarde, ex. disque externe)
  • $logfile (chemin et nom du fichier log)
 ! Message de : pboulanger
ATTENTION :
- C’est une synchronisation "miroir", pas une sauvegarde historique. Les données supprimées dans le dossier source seront aussi supprimées dans la copie.
Comment s'en servir ?
  • Enregistrer le code dans un fichier txt avec l'extension .ps1 par exemple Sauvegarde-Miroir.ps1
  • Clic droit sur l'icône du fichier et commande Exécuter avec PowerShell
  • Le script se ferme à la fin des opérations.
Il ne reste plus qu'à lancer ce script, via le planificateur de taches, régulièrement pour avoir un clone de vos données disponible en permanence.
Perso il tourne à 13:00 et 21:00 tous les jours ...

En espérant que cela vous rende service,
Amicalement,

Pierre
Avatar du membre
MyPOV
Membre VIP
Membre VIP
Messages : 1415
Enregistré le : sam. 11 déc. 2021 14:40
A remercié : 165 fois
A été remercié : 212 fois
    Windows 7 Firefox

Re: [PowerShell] Sauvegarde de type "Miroir"

Message par MyPOV »

[HS]
Salut,
Robocopy, waouw :) j'avais programmé un petit truc en lisp en 2006 avec Robocopy parce qu'il propose l'option de pouvoir retenter la copie d'un fichier toutes les x secondes, alors que la cible à remplacer n'est pas disponible à l'écrasement en étant verrouillée par un autre processus.

J'ai encore sur un disque la version d'époque avec le fichier d'aide obtenu au prompt :

Code : Tout sélectionner

----------------------------------------------------------------------
ROBOCOPY v 1.96  :  Robust File Copy for Windows NT 
----------------------------------------------------------------------

  Started : Tue Jan 17 11:44:41 2006
C'est un super outil.
"𝓛𝓮 𝓭𝓸𝓾𝓽𝓮 𝓮𝓼𝓽 𝓵𝓮 𝓬𝓸𝓶𝓶𝓮𝓷𝓬𝓮𝓶𝓮𝓷𝓽 𝓭𝓮 𝓵𝓪 𝓼𝓪𝓰𝓮𝓼𝓼𝓮" 𝖠𝗋𝗂𝗌𝗍𝗈𝗍𝖾, 𝖼𝗈𝗆𝗉𝗅𝗈𝗍𝗂𝗌𝗍𝖾 𝖦𝗋𝖾𝖼
Avatar du membre
pboulanger
Administrateur du site
Administrateur du site
Messages : 1157
Enregistré le : mar. 17 mars 2020 11:49
A remercié : 141 fois
A été remercié : 143 fois
    Windows 10 Firefox

Re: [PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Message par pboulanger »

:hi: Mypov
Un vieil outil mais qui fait le boulot correctement... Cela ne nous rajeuni pas vraiment ...

Bon week-end
Amicalement,

Pierre
Avatar du membre
pboulanger
Administrateur du site
Administrateur du site
Messages : 1157
Enregistré le : mar. 17 mars 2020 11:49
A remercié : 141 fois
A été remercié : 143 fois
    Windows 10 Firefox

Re: [PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Message par pboulanger »

:hi:

Suite à plusieurs tests, j'ai rencontré des soucis d’affichage des caractères accentués dans les fichiers logs générés par Robocopy.
Cela venait du fait que Robocopy utilisait par défaut des pages de code système différentes (ANSI, OEM…), ce qui provoquait des logs avec des caractères illisibles (‚, ÿ, etc.).

✅ La solution retenue :
  • Utiliser désormais l’option /UNILOG qui force Robocopy à écrire directement le journal en Unicode.
  • Ajouter une conversion automatique du fichier log en UTF-8 BOM, ce qui garantit une lecture correcte dans tous les éditeurs (Notepad, Notepad++, VS Code).
 ! Message de : pboulanger
Le message d’origine du sujet a été mis à jour avec la nouvelle version du code corrigé.
Vous pouvez donc reprendre le script directement dans ce premier post.
👉 Concrètement, rien ne change à l’utilisation du script pour vous, mais désormais les logs sont propres et parfaitement lisibles, même avec des fichiers contenant des accents.

Bonne sauvegarde à tous 😉
Amicalement,

Pierre
Avatar du membre
LuLu38
Membre Officiel
Membre Officiel
Messages : 23
Enregistré le : sam. 9 août 2025 15:17
A remercié : 8 fois
A été remercié : 2 fois
    Windows 10 Chrome

Re: [PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Message par LuLu38 »

:hi:

ça me semble un outil extrêmement simple à utiliser

je vais tester ça et vous tiens au courant
Merci
:beer:
Avatar du membre
curieuxdino
Membre Officiel
Membre Officiel
Messages : 106
Enregistré le : sam. 16 avr. 2016 03:07
A été remercié : 5 fois
    Windows 10 Firefox

Re: [PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Message par curieuxdino »

Oh la la ... ça me parait fort intéressant mais j'ai une question en tête : si ça crée une sauvegarde type clone, comment je peux installer ce "clone" sur un autre appareil ?
Merci
Processeur Intel Core i5-6500 CPU @ 3.20GHz
Mémoire installée 16 Go
Windows 11 Pro. 22h02
Avatar du membre
pboulanger
Administrateur du site
Administrateur du site
Messages : 1157
Enregistré le : mar. 17 mars 2020 11:49
A remercié : 141 fois
A été remercié : 143 fois
    Windows 10 Firefox

Re: [PowerShell] Sauvegarde de type "Miroir" basé sur Robocopy de Microsoft

Message par pboulanger »

:hi: @curieuxdino

En fait, il ne s’agit pas d’un clone au sens « image disque » (qui reproduit intégralement la structure et les secteurs d’un disque, système compris), mais d’une copie directe fichier par fichier.

Le disque de sauvegarde se comporte comme un disque classique : tu vois les dossiers et fichiers exactement comme sur ton ordinateur. Tu peux donc facilement les transférer vers un autre appareil par simple copier-coller, sans avoir besoin d’un logiciel spécial pour « restaurer » l’ensemble.

Il faut juste garder en tête qu’il y a une logique maître / esclave : ce sont toujours les fichiers présents dans la source qui servent de référence pour la copie. Donc si tu supprimes un fichier sur le disque de sauvegarde (la cible), cela n’a aucun impact sur la source. En revanche, si tu supprimes un fichier dans la source, il disparaîtra aussi lors de la prochaine synchronisation vers la cible.

Et si c’est un disque amovible USB par exemple, il suffit simplement de le brancher sur l’autre appareil… et hop, tes fichiers sont accessibles directement !

Bon dimanche,
Amicalement,

Pierre
Répondre