2012-01-26

Sauvegarder un dossier à l'aide de 7z (SevenZip)

Sauvegarde avec Seven-Zip

Pour sauvegarder un dossier, le principe est d'en faire un copie et en générale; on fait une version compressée du dossier. Dans notre cas, je vous propose d'utiliser la version ligne de commande de 7-Zip pour faire ce travail.

La syntaxe de la version ligne de commande est :

7z.exe a -t7z "NOM_ARCHIVE" -r "DOSSIER\*" -mx=8 -mmt=on -bd -y

avec:
  • NOM_ARCHIVE: Nom de l'archive que vous allez créer
    (ex: D:\SAUVEGARDE\MonArchive.7z) 
  • DOSSIER: Chemin du dossier à sauvegarder
    (ex: C:\Mes Documents)
Avec ces informations vous pourrez facilement créer un fichier *.cmd ou *.bat permettant de sauvegarder un dossier dans une archive.

Le fichier 7z.exe se trouve généralement dans le dossier: "C:\Program Files\7-Zip", si bien sur vous avez installé 7-Zip avec l'installateur fournis sur le site.
La première option que je vous recommande est de copier cet exécutable dans le dossier où sera déposé votre script, afin de garantir que celui-ci fonctionne même après une désinstallation de 7-Zip. Si vous ne souhaitez pas copier l'exécutable, je vous recommande la syntaxe suivante:
"%ProgramFiles%\7-Zip\7z.exe"

Sauvegarde avancée

Si vous aurez envie de garder les versions intermédiaires, il faudra prévoir un script plus évolué, je vous propose une solution avec BackupFolder.cmd. Ce script prend deux paramètres:
  • le nom complet (chemin inclus) du dossier à sauvegarder,
  • puis le nom complet (chemin inclus) du dossier où seront mis les sauvegardes.
En gros, il s'agit des mêmes paramètres que pour 7z, mais le résultat produit est différent, puisque le nom généré contient la date et l'heure.
Deux remarques importantes :
  • Ce fichier de commandes s'attend à ce que le programme 7z..exe se trouve le répertoire "%ProgramFiles%\7-Zip"; en général cela correspond à : "C:\Program Files\7-Zip\7z.exe".
  • Le fichier SetISODate.vbs doit se trouver dans le même dossier que BackupFolder.cmd.

Programmer vos sauvegardes

Vous pouvez très bien programmer vos sauvegardes à l'aide des tâches planifiées de Windows. Pour Créer une tâche planifiée avec le fichier de commande BackupFolder.cmd et éditer la ligne de commande pour mettre vos paramètres. 


Fichier:  BackupFolder.cmd
@Echo OFF
@Rem
@Rem ---------------------------------------------------
@Rem Name          : BackupFolder.cmd
@Rem Description   :
@Rem Encodage      : DOS
@Rem ---------------------------------------------------
@Rem BackupFolder.cmd SFOLDER DFOLDER
@Rem
@Rem  SFOLDER : Nom complet (chemin inclus) du dossier à sauvegarder
@Rem  DFOLDER : Nom complet (chemin inclus) du dossier où seront mis les sauvegardes.
@Rem

Set ISODATEVBS=%~pd0setISODate.vbs
Set TMPISOCMD=%TEMP%\.tmpiso.cmd

cscript //Nologo "%ISODATEVBS%" ISODATE>"%TMPISOCMD%"

@CALL "%TMPISOCMD%" 
@Echo ISODATE=%ISODATE%

Set SFOLDER=%~1
Set DFOLDER=%~2
Set ARCHIVE=%DFOLDER%\%ISODATE%.%~n1.7z

Echo ARCHIVE=%ARCHIVE%

@IF NOT DEFINED SFOLDER (
  goto SYNTAX
  )
@IF NOT DEFINED DFOLDER (
  goto SYNTAX
  )
@IF NOT EXIST "%SFOLDER%" (
  Echo ERROR: SFOLDER not found : %SFOLDER%
  goto :eof
  )
@IF NOT EXIST "%DFOLDER%" (
  Echo WARN: DFOLDER not found : %DFOLDER%
  MD "%DFOLDER%"
  )
@IF EXIST "%ARCHIVE%" (
  Echo WARN: Archive already exist : %ARCHIVE%
  )

@Rem BackupFolder.cmd localtion -  Set EXE=%~pd07z.exe
@Rem default localtion - 
Set EXE=%ProgramFiles%\7-Zip\7z.exe

"%EXE%" a -t7z "%ARCHIVE%" -r "%SFOLDER%\*" -mx=8 -mmt=on -bd -y
@Echo EL=%ERRORLEVEL%

goto :eof

:SYNTAX
@Echo Syntaxe:

goto :eof
Fichier:  setISODate.vbs
Set objArgs=Wscript.Arguments

If WScript.Arguments.Length >0 Then
  varname=WScript.Arguments.Item(0)
Else
  varname="ISODATE" 
End If 

aday=Right("0"+Cstr(day(date)),2)
amonth=Right("0"+Cstr(month(date)),2)
ayear=Right("000"+Cstr(year(date)),4)
aHour=Right("0"+CStr(hour(time)),2)
aMins=Right("0"+CStr(minute(time)),2)
iso=ayear+"-"+amonth+"-"+aday+"_"+aHour+"-"+aMins

WScript.echo( "Set "+varname+"="+iso )
[Edit] La partie en gras italique, permet de prendre en compte l'heure (à la minute près) pour le nom de l'archive.

Pour finir ce billet et juste pour le fun, sous unix on fait quelque chose de semblable avec la commande suivante:

tar cvf - ${SFOLDER}| gzip > `date +"%Y-%m-%d"`.${SFOLDER}.tar.Z
No comment.

2 commentaires:

  1. Super : merci beaucoup !
    Je viens d'utiliser avec succès les scripts que tu as écris.
    J'aurais une question bonus : je souhaite créer plusieurs archives par jour pour une sauvegarde, et il faudrait donc que j'ajoute l'heure de la sauvegarde.
    Je ne suis pas parvenu a modifier le code de "SetISODate.vbs" en conséquence... Peux tu me donner la solution ?

    RépondreSupprimer
  2. Je réponds à ma question précédente, car j'ai finalement trouvé tout seul comme un grand : voici le code permettant d'écrire en plus l'heure et les minutes :

    Set objArgs=Wscript.Arguments

    If WScript.Arguments.Length >0 Then
    varname=WScript.Arguments.Item(0)
    Else
    varname="ISODATE"
    End If

    aday=Right("0"+Cstr(day(date)),2)
    amonth=Right("0"+Cstr(month(date)),2)
    ayear=Right("000"+Cstr(year(date)),4)
    ahour=Right("0"+Cstr(Hour(time)),2)
    aminute=Right("0"+Cstr(Minute(time)),2)
    iso=ayear+"-"+amonth+"-"+aday+"-"+ahour+"h"+aminute

    WScript.echo( "Set "+varname+"="+iso )

    RépondreSupprimer