Batch + roulement de fichier

Batch + roulement de fichier - Shell/Batch - Programmation

Marsh Posté le 18-08-2004 à 13:33:36    

Salut,
 
J'ai besoin d'un peu d'aide :)
Donc voila, j'ai sql server qui me fait tous les soirs (sauf samedi et dimanche) un dump de plusieurs bases de données.
 
Les bases etant grosses je dois les compresser, j'ai donc fait ce batch (merci Robby pour l'aide)
 

Code :
  1. REM ******************* On declare les variables *******************
  2. set REP=c:\toto
  3. REM ******************* On recherche les dumps a compresser *******************
  4. cd %REP%
  5. :SEARCH_DUMP
  6. if EXIST %REP%\*.bak FOR /F "tokens=1,2* delims=." %%i in ('dir /B *.bak') do SET NOM_BASE=%%i.%%j
  7. if NOT EXIST %REP%\*.bak GOTO END
  8. REM ******************* On compresse le dump *******************
  9. if EXIST %REP%\%NOM_BASE% FOR /F "tokens=1,2* delims=." %%i in ('dir /B %REP%\%NOM_BASE%') do gzip %REP%\%NOM_BASE%
  10. GOTO SEARCH_DUMP
  11. :END
  12. EXIT


 
 
Par contre, SQL me créé un fichier en .bak, et il s'occupe lui même du roulement.
Si je ne fais rien je vais me retrouver avec tout pleins de dump compressé, car sqlserver ne retrouvera pas l'ancienne version.
 
Comment donc faire dans un batch pour comparer plusieurs fichiers avec une certaine extension, resortir le plus vieux et le supprimer ?
 
Dans mon cas actuel on fait comme si il n'y avait qu'une base, apres je vais créer un batch par base pour la compression.
 
Merci pour votre aide :)


Message édité par lebibi le 18-08-2004 à 13:35:29

---------------

Reply

Marsh Posté le 18-08-2004 à 13:33:36   

Reply

Marsh Posté le 18-08-2004 à 13:53:58    

et puis aussi voir si la date du fichier n'est pas celle qui vient juste d'etre dumpé histoire de ne pas virer le seul backup :)


---------------

Reply

Marsh Posté le 18-08-2004 à 14:17:50    

dejà tu peux utiliser la parametre /OD de la commande DIR pour trier par date...c'est dans l'ordre croissant du plus vieux au plus recent que ça affichera...
si ça t'aide pas, je commence à plancher sur un .bat qui va "comparer plusieurs fichiers avec une certaine extension, resortir le plus vieux et le supprimer"...
 
++
 
Arrakeen

Reply

Marsh Posté le 18-08-2004 à 15:01:07    

merci :)
je suis trop nul en algo :d


---------------

Reply

Marsh Posté le 18-08-2004 à 15:43:51    

voila une petite sub-routine qui delete le plus vieux fichier dans une extension donnee.
la routine s'appelle :DELETEOLDEST
elle s'appelle avec l'extension en parametre.
ex: call :DELETEOLDEST txt
--> deletera le plus vieux fichier txt
 
voici un exemple d'execution:
 
dans un repertoire, j'ai 3 fichiers txt, dont le plus vieux est toto.txt :
 

Code :
  1. C:\old>dir /B /OD *.txt
  2. toto.txt
  3. titi.txt
  4. tata.txt


 
 
voici mon .bat :
 

Code :
  1. @echo off
  2. call :DELETEOLDEST txt
  3. goto EXIT
  4. :DELETEOLDEST
  5. dir /B /OD *.%1 | find "%1" /N | find "[1]" > temp.txt
  6. for /F "tokens=1,2* delims=]" %%i in (temp.txt) do echo le plus vieux fichier %1 est : %%j
  7. del temp.txt
  8. goto EXIT
  9. :EXIT


 
...et son execution :
 

Code :
  1. C:\old>old.bat
  2. le plus vieux fichier txt est : toto.txt


 
 
voilou, t'as plus qu'à remplacer la commande echo par del
 

Reply

Marsh Posté le 18-08-2004 à 16:08:41    

merci beaucoup :)
 
je l'ai adapté et tout fonctionne comme je veux !!


---------------

Reply

Marsh Posté le 18-08-2004 à 16:11:58    

une derniere question je voudrais qu'il verifie le nombre de fichier trouvé.
 
C'est a dire, si par exemple il ne trouve que 3 fichiers.txt alors il ne supprime pas le plus vieux et il fait un exit
 
Par contre si il en trouve + de 3 on passe la moulinette.
 
C'est histoire d'avoir tjs 3 versions des dumps au minimum :)
 
C'est possible aussi ?


Message édité par lebibi le 18-08-2004 à 16:15:58

---------------

Reply

Marsh Posté le 18-08-2004 à 16:15:15    

vi possible...j'y travaille...

Reply

Marsh Posté le 18-08-2004 à 16:18:24    

merci, ne te presse pas, y a pas trop le feu :)


---------------

Reply

Marsh Posté le 18-08-2004 à 16:31:28    

hop, voici mon .bat révisé :
 

Code :
  1. @echo off
  2. call :DELETEOLDEST txt
  3. goto EXIT
  4. :DELETEOLDEST
  5. :: je recup le nombre de fichiers dans la variable count
  6. dir /B /OD *.%1 | find /C "%1" > temp
  7. for /F "tokens=1 delims=" %%i in (temp) do set count=%%i
  8. :: je teste le count, si sup à 3 je supprime le plus vieux
  9. if "%count%" GTR "3" (
  10. dir /B /OD *.%1 | find "%1" /N | find "[1]" > temp
  11. for /F "tokens=1,2* delims=]" %%i in (temp) do echo je delete %%j
  12. del temp
  13. )
  14. goto EXIT
  15. :EXIT


Message édité par Arrakeen le 18-08-2004 à 16:32:27
Reply

Marsh Posté le 18-08-2004 à 16:31:28   

Reply

Marsh Posté le 19-08-2004 à 09:32:11    

Encore un grand merci à toi, je test ca de suite :)
 
A+


---------------

Reply

Marsh Posté le 19-08-2004 à 17:11:40    

un derniere question :
 
dans un batch principale de je vais appeler tous mes autres batch (environ 15) mais je voudrais qu'il me les lance 1 par 1
 
j'ai mis ca :
 
 
start batch1
start batch2
start batch3
 
Mais il va me les lancer en meme temps non ?
Comment faire pour lui dire d'attendre ? Mettre un sleep ?


---------------

Reply

Marsh Posté le 19-08-2004 à 17:17:10    

bon j'ai trouvé, en faisant un call et en virant les EXIT a la fin des autres scripts ;)
 
A+


---------------

Reply

Marsh Posté le 19-08-2004 à 17:17:44    

non c bon, il devrait les lancer 1 par 1...on peut pas faire du pseudo parallelisme en DOS comme sous unix avec le '&' pour lancer les scripts en background...en DOS, tout s'execute sequentiellement...

Reply

Marsh Posté le 19-08-2004 à 17:39:22    

bon, dans le doute, fait des :
 
start /WAIT batch1
start /WAIT batch2
:
 
fait un help start pour voir toutes les options...
 

Reply

Marsh Posté le 19-08-2004 à 18:03:30    

c'est bon ca tourne aussi avec les call
j'ai pu recuperer 25 Go d'espace disque quand même a compresser les dumps :)
 
je verrais demain maintenant si le prog a bien fonctionné cette nuit :)
 
Merci encore à toi Arrakeen :)


---------------

Reply

Marsh Posté le 19-08-2004 à 18:05:17    

de rien l'ami, tout le plaisir est pour moi ;-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed