[BATCH] Script de Sauvegarde incrémentielle!!

Fermé
Slam - 18 oct. 2010 à 14:05
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 19 oct. 2010 à 15:31
Bonjour,

J'ai récemment entrepris de me programmer un petit script en langage MS-DOS sous Windows 7 pour automatiser la sauvegarde de fichiers placés dans un dossiers spécifique sur la machine; vers un disque réseau.

Le programme est fonctionnel et tourne parfaitement, mais ce que je voudrais simplement faire maintenant si c'est possible, c'est de mettre une limite de taille par fichier pouvant être copié sur le réseau. Une limite assez large pour ne pas forcer les utilisateurs à faire la sauvegarde manuellement, mais pour tout de même lever une exception si un fichier dépassé une taille fixée, pour que cette copie ne prenne pas trop de temps, étant exécutée en fermeture de session. (automatique)

Voici le code:

@echo off
rem "Script d'automatisation de sauvegarde Travaux pour poste portable"

Title Enregistrement des Travaux sur Reseau

rem  ***** mise en place des variables pour le fichier log (si créé) *****

set data=Copie du: %Date% a %Time%
set sep=----------------------------------

rem *****  En-tête  ******

echo           ************************************
echo           *                                                                     *
echo           *    Programme de sauvegarde Travaux         *
echo           *           - Created by Slam W. V1.0 -              *
echo           *                                                                     *
echo           ************************************

rem ***** Début du programme *****

:start

rem ***** test si disque de destination présent (si on se trouve sur le réseau ou non) *****

if not exist "Z:\" goto end   
rem si nous ne sommes pas sur le réseau, la copie ne sert à rien, nous nous rendons à la fin "end" pour fermer le programme


rem ***** test si les repertoires source et destination pour la backup existent (nous sommes connectés au réseau) ******

:test1

if not exist "C:\Documents and Settings\%Username%\Mes documents\Travaux\" goto creation1   
rem  si le répertoire "Travaux" n'existe pas, on se rend à "creation1" pour le créer

rem **** Test si le repertoire "Backup" pour stocker les fichiers copiés existe sur le disque réseau ******

:test2

if not exist "Z:\Backup\" goto creation2  
rem  s'il n'existe pas on va en "creation2" pour le créer 

rem ***** test si le dossier de l'utilisateur existe dans le Backup réseau *****

:test3

if not exist "Z:\Backup\%Username%\" goto creation3   
rem s'il n'existe pas, idem, on le crée automatiquement dans "creation3"


rem **** Tous les test ont été effectué, l'arborescence est créée, on peut lancer la copie *****

:copie

rem ***commande pour le log.txt (desactivée pour permettre à l'utilisateur de voir le déroulement du programme; à réactivée pour un programme se lançant au démarrage ou extinction du pc)

rem echo. >> "G:\Backup\%Username%\log.txt"
rem echo %sep% >> "G:\Backup\%Username%\log.txt"
rem echo %data% >> "G:\Backup\%Username%\log.txt"
rem echo %sep% >> "G:\Backup\%Username%\log.txt"
rem echo. >>"G:\Backup\%Username%\log.txt"
rem echo. >>"G:\Backup\%Username%\log.txt"

cd C:\Documents and Settings\%Username%\Mes documents\Travaux\  
rem  déplacement dans le dossier "Travaux" pour la copie 
echo.
echo Copie en cours...Veuillez patienter,le temps varie selon la taille des fichiers.
echo.
rem xcopy *.* "G:\Backup\%Username%\" /V /Y /I /D /E /F >> "G:\Backup\%Username%\log.txt"       VERSION POUR AVOIR LE LOG 
xcopy *.* "Z:\Backup\%Username%\" /V /Y /I /D /E   
rem commande xcopy permet de copier les fichiers du dossier "Travaux" vers le dossier de l'utilisateur dans le Backup.  ( le parametre *.* permet de prendre tous fichiers, noms et extensions confondus ) 
rem version sans le log, pour voir la copie
echo.
echo.
echo Copie terminee!
echo.
goto end3   
rem copie terminée, on se rend en "end3" pour terminer le programme 


rem **** Creation du repertoire Travaux *****

:creation1

cd C:\Documents and Settings\%Username%\Mes documents\   
rem  commande "cd" permet de se déplacer dans le répertoire voulu (la variable %username% récupère le nom d'utilisateur actuellement connecté
md Travaux  
rem  création du répertoire Travaux 
ping 127.0.0.1 -n 2 > NUL   
rem cette commande substitue la commande "delay" utilisée dans d'autres language pour marque un temps de pause le temps de faire une action. Ici cette commande ping la machine locale (adresse 127.0.0.1) avec le parametre " -n 2 " pour une pause de 2 secondes, cette valeur peut donc être modifiée
echo. 
rem  permet de sauter une ligne
echo Copie impossible car le dossier Travaux n existait pas ou a ete deplace, il a    maintenant ete cree.Veuillez y deplacer vos fichiers a sauvegarder et relancer le programme.
rem les espaces ont été placé intentionnelement pour une meilleur lisibilité sur une invite de commande taille standard.
echo.
goto end2  
rem  le dossier est maintenant créé, on se rend en "end2" pour terminer le programme et inviter l'utilisateur à le relancer après qu'il ait déplacer ses fichiers à copier dans "Travaux"


rem  ****  Creation du repertoire de Backup et utilisateur ****

:creation2


md Z:\Backup\  
rem  creation du repertoire de backup 
ping 127.0.0.1 -n 2 > NUL   
rem  on laisse un délai avant de passer à la deuxieme étape, en cas de latence sur le réseau ... moins rapide qu'en local 

md Z:\Backup\%Username%\  
rem creation du repertoire de l'utilisateur dans le backup 
ping 127.0.0.1 -n 2 > NUL   
rem  on laisse un délai avant de passer à la deuxieme étape, en cas de latence sur le réseau ... moins rapide qu'en local 
echo.
echo Le dossier backup ete inexistant sur le disque destination il a maintenant ete  cree, ainsi que votre sous dossier personnel pour accueillir vos fichiers de    sauvegarde.
echo.
goto test3   
rem le dossier est maintenant créé on reprend le cours du programme au test3

rem *** creation du repertoire utilisateur uniquement **** 

:creation3

md Z:\Backup\%Username%\
ping 127.0.0.1 -n 2 > NUL 
echo Votre dossier personnel de sauvegarde n etait pas present sur le disque reseau, il a maintenant ete cree
goto test3

:end2

rem compte à rebours de fermeture

echo fermeture dans 10 sec
ping 127.0.0.1 -n 5 > NUL 
echo                 5 sec
ping 127.0.0.1 -n 1 > NUL
echo                 4 sec
ping 127.0.0.1 -n 1 > NUL
echo                 3 sec
ping 127.0.0.1 -n 1 > NUL
echo                 2 sec
ping 127.0.0.1 -n 1 > NUL 
echo                 1 sec
ping 127.0.0.1 -n 1 > NUL
goto fin


:end3
echo fermeture dans 5 sec
ping 127.0.0.1 -n 5 > NUL 

goto fin

:end


echo Non connecte au reseau (disque Z: non visible) fermeture dans 3 sec.
ping 127.0.0.1 -n 4 > NUL 
goto fin

:fin

exit  
rem terminaison du programme 


Pour ma part, j'ai fait quelque recherches et n'ai pas trouvé de moyens de rendre cela possible, d'intégrer une limite de vérification de taille de fichier, sachant que cette vérification s'intégrerait pour moi dans la boucle de la fonction XCOPY.

Je m'explique:

Ce que je voudrais, c'est que le programme, test la taille du fichier en cours,

si TailleFichier < Taille max COPIE ok
sinon "Message d'informations fichier trop volumineux", et o passe au fichier suivant.


Voilà je sais qu'il y a beaucoup à digérer, mais j'espére que certains d'entres vous pourront m'apporter des réponses, ou des pistes,

Cordialement

Sl@m



A voir également:

3 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 18/10/2010 à 22:25
Bonsoir,

J'ai récupéré ça (%%~zI) dans un de mes programmes, il semble que ce soit ce que tu cherches à faire :

SET /A TailleFichier = 0

FOR %%I IN ("000.bat") DO ( SET /A TailleFichier = %%~zI )

echo taille du fichier 000.bat: %TailleFichier% octets.

(2em Ajout - oubli lors du 1er ajout.) Résultat :
taille du fichier 000.bat: 211 octets.

(1er Ajout - Précision.) Vérification:
En consultant, sous l'explorateur Windows, les propriétés du fichier de test 000.bat j'ai bien 211 octets pour la taille.


Cordialement.
Cchristian.
2
Bonjour Cchristian,

Tout d'abord merci de ta réponse, cela me sembel être un bon début puisque cela fonctionne, la taille est bien récupérée par ton expression (en test à part de mon batch de sauvegarde).

Mais maintenant il me faut l'adapter:

- dans ma sauvegarde, je ne connais pas le nom des fichiers à copier ni leur extension, d'où le "*.*" dans le code qui suit.
- ensuite, il y a plusieurs fichiers bien évidemment, penses-tu qu'il est possible d'intégrer un test IF dans cette boucle FOR pour tester la taille de chacun de ces fichiers par rapport à une taille max.
- enfin, la plus grosse partie ... intégrer tout cela à mon premier script dans le xcopy ... ou bien le xcopy qui s'intégrerai dans une de ces boucles, mais il me faudrait alors un moyen de récupérer à chaque fois le nom des fichiers ... A voir

En gros:

cd "C:\Documents and Settings\%username%\Bureau\testing

SET /A TailleFichier = 0 
SET /A TailleMax = 150000
SET msg = taille du fichier trop volumineux, copie manuelle nécessaire pour ce fichier dépassant 150 Mo

:node
FOR %%I IN ("*.*") DO ( SET /A TailleFichier = %%~zI )
goto node1

pause
goto end


:node1
IF %TailleFichier% >= %TailleMax% echo %msg%


:end
pause



Je précise que c'est un test qui ne fonctionne pas à cause du IF ... surement mal écrit syntaxiquement, mais j'ai testé de plusieurs façon et s'il y a plusieurs fichiers dans le dossier, il me récupère la taille du dernier fichier.
Donc il réalise toute la boucle for avant de passer au reste alors qu'il faudrait pouvoir y imbriquer le IF, d'où le test avec les différents noeuds.

En clair ce que je voudrais faire:


for %%I In (*.*) Do {

       TailleFichier = %%~zI;
       
        if (TailleFichier >= TailleMax){
            echo "Fichier NomFichier  trop volumineux, copie manuelle nécéssaire.
           }
         else {
            suite du programme
                 ou
             xcopy en fonction du NomFichier
           }
}




J'ai mélangé les langages, mais la compréhension est globale... pour tout dire je débute en BATCH donc même les %%~zI , etc .. je n'ai pas tout compris ^^

Merci de ton aide,

Cordialement
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 19/10/2010 à 15:38
Bonjour,

J'espère que ce qui suit répondra à tes questions (séquence testée).

rem (!....!) VOIR HELP SET expansion retardée de variables sous l'invite de
rem commandes (dernière page)
SETLOCAL ENABLEdelayedExpansion
SETLOCAL ENABLEextensions

SET /A TailleMax = 15000

rem (%%I) VOIR HELP FOR sous l'invite de commandes dernière page
for %%I In (*.*) Do (
ECHO _

rem %%~nI: VOIR HELP FOR sous l'invite de commandes dernière page
ECHO "Pour Controle en test nom + extension du fichier: %%I: ."
ECHO " ou bien nom seul du fichier: %%~nI."
rem %%~xI: VOIR HELP FOR sous l'invite de commandes dernière page
SET "ExtensFichier=%%~xI"
ECHO "Pour Controle en test extension du fichier %%I: !ExtensFichier!."

rem %%~zI: VOIR HELP FOR sous l'invite de commandes dernière page
SET /A TailleFichier = %%~zI
ECHO "Pour Controle en test taille du fichier %%I: !TailleFichier! octets."

rem GEQ: VOIR HELP IF sous l'invite de commandes dernière page
rem !....!: VOIR HELP SET expansion retardée de variables sous l'invite de
rem commandes (dernière page)
rem Dans un IF ce sont des parenthèses, non des {}.
if !TailleFichier! GEQ !TailleMax! (
echo "Fichier %%I trop volumineux, copie manuelle nécéssaire."
) else (
echo "suite du programme"
rem ou
echo "xcopy en fonction du %%I"
)
)

Cordialement.
Cchristian.
0