[BATCH] Script de Sauvegarde incrémentielle!!
Slam
-
cchristian Messages postés 921 Date d'inscription Statut Membre Dernière intervention -
cchristian Messages postés 921 Date d'inscription Statut Membre Dernière intervention -
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:
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
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:
- [BATCH] Script de Sauvegarde incrémentielle!!
- Logiciel sauvegarde incrémentielle gratuit - Guide
- Script vidéo youtube - Guide
- Fichier batch - Guide
- Sauvegarde facile - Télécharger - Sauvegarde
- Sauvegarde android - Guide
3 réponses
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.
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.
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:
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:
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
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
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.
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.