{"uuid":"e8a429b5-5378-4775-a750-dd35dea9791f","slug":"robocopy-sauvegarder-avec-windows","title":"Sauvegarder ses documents avec Windows","author":"cedric@abonnel.fr","published":true,"published_at":"2020-04-17 18:06:07","created_at":"2020-04-17 18:06:07","updated_at":"2020-04-17 18:06:07","revisions":[],"cover":"","files_meta":[],"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Informatique","content":"# Sauvegarder ses documents avec Windows\n\n\nTesté **non** | Nécessite \n\nCet article est extrait du podcast [mindCast Info, sauvegarder ses documents](https://www.abonnel.fr/podcast/?name=2018-11-22_cedric_info_13_robocopy_la_sauvegarde_sous_windows.mp3)\n\n## - Objectif\nJ'ai une de mes connaissances qui m'a demandé **comment faire une sauvegarde** avec Windows.\\\\\nIl s'agit bien d'effectuer une réplication des données des documents de l'ordinateur vers une unité de stockage extérieure.\n\nJe me suis fixé comme objectif de **ne pas utiliser de programmes complémentaires** à ceux déjà existants sous Windows et d'essayer de **maitriser au maximum le processus**, avec un **temps minimum à l’exécution**.\n\nVoici mes explications. Travaux pratiques pour effectuer une sauvegarde \"intelligente\" sous Windows.\n\nLe but est bien de maintenir l’image parfaite des dossiers ou documents de l'ordinateur (appelés source) vers une unité de stockage extérieure (appelée destination) sans tout recopier systématiquement.\nPour ne pas faire une sauvegarde intégrale de tous vos dossiers à chaque fois, on va essayer d'utiliser un programme qui compare et sauvegarde les modifications des fichiers ou dossiers réalisées à l’aide d’un logiciel.\n\nPour plus de simplicité, j’ai préféré ne pas utiliser de programmes complémentaires mais uniquement ceux qui sont déjà disponibles sous Windows. Ceci afin que vous puissiez maitriser au maximum le processus, dans un temps raisonnable par son exécution.\n\n## - Solution\nLe programme choisi est **robocopy**. Il s'agit d'un programme en **ligne de commande**. Pour l'executer, nous allons programmer les commander dans un fichier d'execution appelé **BATCH**. Ce sont des fichiers terminant par l'extension **.BAT**.\n\nAu premier lancement, le programme fait une copie intégrale de vos documents vers l'unité de sauvegarde. Cela peut prendre beaucoup de temps.\\\\\nAux lancements suivants, le programme effectue une sauvegarde incrémentielle (suppression, modification et ajout des fichiers), ce qui prend beaucoup moins de temps.\n\n## - Le code\n### - Sauvegardes des dossiers identifiés\nJ'aurai pu identifier les 4 dossiers principaux`Documents`, `Bureau`, `Téléchargement` et le dossier `'', mais j'effectue une sauvegarde complète du dossier utilisateur.\n\n```DOS\n@echo off\nREM A ecrire dans un fichier sauvegarde_all.bat\nREM On sauvegarde tous les dossiers des Users et AppData\n\nREM Adapter les variables ci-dessous si nécessaire\n \nset racine_sauvegarde=e:\\sauvegarde\nset dossier_sauvegarde=%racine_sauvegarde%\\%computername%\nif not exist \"%TMP%\\robocopy\" mkdir \"%TMP%\\robocopy\"\nset \"log_out_script=%TMP%\\robocopy\\synthese.txt\"\nset \"log_err_robocopy=%TMP%\\robocopy\\robocopy_%dateTime%_err.txt\"\nset \"log_out_robocopy=%TMP%\\robocopy\\robocopy_%dateTime%_out.txt\"\nset rbcpy_errorlevel=0\n\nREM ** on cree le dossier de sauvegarde s'il n'existe pas\nIF NOT EXIST \"%destination_sauvegarde%\" mkdir \"%destination_sauvegarde%\"\n\ngoto save_3\n\nREM ** on commence la sauvegarde 1\nset \"source_sauvegarde=C:\\Users\"\nset \"destination_sauvegarde=%dossier_sauvegarde%\\Users\"\ncall :CALLROBOCOPY source_sauvegarde destination_sauvegarde log_out_script\n\nREM ** on commence la sauvegarde 2\nset \"source_sauvegarde=C:\\ProgramData\"\nset \"destination_sauvegarde=%dossier_sauvegarde%\\ProgramData\"\ncall :CALLROBOCOPY source_sauvegarde destination_sauvegarde log_out_script\n\nREM ** on commence la sauvegarde 3\n:save_3\nset \"source_sauvegarde=C:\\Users\\adm_cedric\\Documents\"\nset \"destination_sauvegarde=%dossier_sauvegarde%\\users\\adm_cedric\\Documents\"\ncall :CALLROBOCOPY source_sauvegarde destination_sauvegarde log_out_script\n\nGOTO FIN\n\n:ERREUR\n echo ********** FIN ANORMALE DU TRAITEMENT *****\n exit /B 1\n\n:FIN\n REM ** on termine la sauvegarde par marquer un horodatage\n echo ********** FIN NORMALE DU TRAITEMENT *****\n exit /B 0\n\nrem CALLROBOCOPY SOURCE DESTINATION LOG\nrem \nrem SOURCE [IN, STR] Nom de la variable contenant le chemin de la source à copier\nrem DESTINATION [IN, STR] Nom de la variable contenant le chemin de la destination\nrem LOG [IN, STR] Chemin pour accéder au LOG du script\nrem\n:CALLROBOCOPY\n call :GETLOCALDATETIME dateCUR timeCUR\n set dateTime=%dateCUR%_%timeCUR%\n echo %dateTime% - DEBUT - sauvegarde \"%source_sauvegarde%\" dans \"%destination_sauvegarde%\" >>\"%log_out_script%\"\n if not exist \"%TMP%\\robocopy\" mkdir \"%TMP%\\robocopy\"\n set \"log_err_robocopy=%TMP%\\robocopy\\robocopy_%dateTime%_err.txt\"\n set \"log_out_robocopy=%TMP%\\robocopy\\robocopy_%dateTime%_out.txt\"\n echo Lancement de la copie de %source_sauvegarde%\n echo Lancement de la copie de %source_sauvegarde% >>\"%log_out_robocopy%\"\n Robocopy.exe \"%source_sauvegarde%\" \"%destination_sauvegarde%\" /E /MIR /Z /DCOPY:T /COPY:DT /TIMFIX /R:0 /W:0 /TEE /NP 1>>\"%log_out_robocopy%\" 2>>\"%log_err_robocopy%\"\n set rbcpy_errorlevel=%errorlevel%\n \n REM ** on termine la sauvegarde par marquer un horodatage\n call :GETLOCALDATETIME dateCUR timeCUR\n set dateTime=%dateCUR%_%timeCUR%\n echo %dateTime% - FIN - sauvegarde effectuee avec le code %rbcpy_errorlevel% 1>>\"%log_out_script%\"\n \n if %rbcpy_errorlevel% NEQ 0 (\n echo ROBOCOPY s'est executé avec le code erreur %rbcpy_errorlevel%. Vérifier les logs dans %TMP%\\robocopy\n goto ERREUR\n ) ELSE (\n GOTO :EOF\n )\n\nrem GETLOCALDATETIME RESULTDATE RESULTTIME\nrem Extraire la date et l'heure independemment des parametres regionaux\nrem Extraire la date au format YYYYMMDD et l'heure au format HHMMSS\nrem RESULTDATE [OUT, STR] Nom de la variable contenant le date au format YYYYMMDD\nrem RESULTDATE=0 si la date n'a pas pu etre extraite\nrem RESULTTIME [OUT, STR] Nom de la variable contenant l'heure au format HHMMSS\nrem RESULTTIME=0 si l'heure n'a pas pu etre extrait\n:GETLOCALDATETIME\n set RESULT=\n for /f \"tokens=* skip=1 delims=\" %%A in ('wmic os get LocalDateTime') do (\n if not defined RESULT set RESULT=%%A\n )\n if not defined RESULT set RESULT=0\n if %RESULT%==0 (\n if \"%~1\" NEQ \"\" (set %~1=%RESULT%)\n if \"%~2\" NEQ \"\" (set %~2=%RESULT%)\n ) else (\n if \"%~1\" NEQ \"\" (set %~1=%RESULT:~0,8%)\n if \"%~2\" NEQ \"\" (set %~2=%RESULT:~8,6%)\n )\n goto :EOF\n```\n\nIl ne faut pas modifier les fichiers et dossiers de la sauvegarde externe au risque de perdre votre travail.\n\n### - Sauvegardes les dossiers de tous les utilisateurs\nPour se simplifier la tâche on pourrait sauvegarder tous les fichiers et dossiers présents dans le dossier des utilisateurs.\\\\\nMais ce n'est pas si simple, car les dossiers des utilisateurs peuvent être protégés en lecture. Il faudrait avoir des droits plus étendus. On parle alors de droit ACL. Une exécution du script avec les droits administrateur permettrait de contourner le problème.\n\n```DOS\nREM A ecrire dans un fichier sauvegarde_all.bat\n\nREM Adapter les variables ci-dessous si nécessaire\n\nset source_sauvegarde=%homedrive%%homepath%\\..\nset racine_sauvegarde=e:\\sauvegarde\nset destination_sauvegarde=%racine_sauvegarde%\\%computername%\n\nREM **************************************\nREM ***** NE PAS MODIFIER EN DESSOUS *****\nREM **************************************\n\nREM ** on cree le dossier de sauvegarde s'il n'existe pas\nIF NOT EXIST \"%destination_sauvegarde%\" mkdir -p \"%destination_sauvegarde%\"\n\nREM ** on commence la sauvegarde\nRobocopy.exe \"%source_sauvegarde%\\\\\" \"%destination_sauvegarde%\" /E /MIR /Z /DCOPY:T /COPY:DT /TIMFIX /R:0 /W:0 /TEE /NP\n\nREM ** on termine la sauvegarde par marquer un horodatage\nset dateCUR=%date:~6,4%%date:~3,2%%date:~0,2%\nset timeCUR=%time:~0,2%%time:~3,2%%time:~6,2%\nset dateTime=%dateCUR%_%timeCUR%\necho %dateTime% sauvegarde \"%source_sauvegarde%\" dans \"%destination_sauvegarde%\" effectuee >>\"%racine_sauvegarde%\\infos.txt\"\n```\n\n## - Vérification\nIl va falloir vérifier que les fichiers contenu dans la **source** soit également dans la **destination**. Pas un de plus, pas un de moins. C'est là que les choses se corsent. Lors de mes tests, il est apparu que l'explorateur de fichier calculé n'importe quoi, n'importe comment.\\\\\nIl a fallu que je retourne dans une fenêtre de **ligne de commandes** (fenêtre DOS) et jouer avec la commande`dir''.\n\nJe vous détaillera cela ultérieurement. Revenez plus tard sur cette page SVP.\n\n## - Évolutions\nProchainement\n- une vidéo pour montrer comment j'ai fait.\n- la vérification du contenu synchronisé.\n- le changement de lecteur à chaque branchement d'un disque externe ?\n- faut-il préférer une sauvegarde externe ou interne ?\n- faut-il faire confiance à une sauvegarde sur clé USB, disque SSD, DVD ?\n- corriger les fautes.\n- compléter l'article suivant vos retours","featured":false,"tags":[]}