boucle en batch

boucle en batch - Shell/Batch - Programmation

Marsh Posté le 12-08-2008 à 15:14:17    

Bonjour,
 
J'ai un script nommé par exemple script.bat avec un ou plusieurs fichiers passés en paramètre !
Ce qui nous donne : script.bat fic1 fic2 fic3
Le nombre de fichiers passés en paramètre est aléatoire !
 
Je voudrai dans un premier temps lister l'ensemble des fichiers passés en paramètre afin de savoir s'ils existent !
Et dans un deuxième temps, si tous les fichiers sont présent, les horodater !
 
J'ai donc une première boucle qui liste l'ensemble des fichiers d'un répertoire et un fait test d'existence de ces fichiers.
 
:debut_boucle
IF "%2"=="" GOTO horodatage
set fic=%2
SHIFT
 
set /a nbParams+=1
     if not exist "%rep%\%fic%" (
     echo Le fichier %fic% n'existe pas ! >>%LOG%
     goto fin_erreur
     )
goto debut_boucle
 
Si tout les fichiers existent je voudrais dans une deuxième boucle les horodater d'où le GOTO horodatage
 
:horodatage
:debut
IF "%2"=="" GOTO fin_boucle
set fic=%2
 
SHIFT
set /a nbParams+=1
 
set datetime=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%
rename %rep%\%fic% %datetime%_%fic%
 
goto debut
:fin_boucle
 
Le problème est que cette deuxième boucle ne fonctionne absolument pas ! Je n'arrive pas à récupérer la liste de fichiers passés en paramètre !
Quelqu'un aurait il une petite idée pour résoudre mon problème ?

Reply

Marsh Posté le 12-08-2008 à 15:14:17   

Reply

Marsh Posté le 12-08-2008 à 16:06:25    

Ne jamais faire des GOTO ou autres joyeusetés de l'assembleur en batch.

Code :
  1. #!/bin/bash
  2. for argument in $*
  3. do
  4.   echo $argument
  5. done


T'affichera chacun des arguments passés en entrée.
 

Reply

Marsh Posté le 12-08-2008 à 16:12:45    

Merci H4rold pour ta réponse mais je suis sous dos !

Reply

Marsh Posté le 12-08-2008 à 16:14:04    

coolkis a écrit :

Merci H4rold pour ta réponse mais je suis sous dos !


 
Oups pardon j'ai lu beaucoup trop vite.
Il n'y a pas de boucles en DOS ? Parceque les gotos c'est tendu quand même.

Reply

Marsh Posté le 12-08-2008 à 16:19:16    

Si bien sur ! Il existe aussi la boucle FOR sous dos. C'est juste que je ne vois pas comment résoudre mon problème avec cette solution !!!!

Reply

Marsh Posté le 12-08-2008 à 16:25:48    

coolkis a écrit :

Si bien sur ! Il existe aussi la boucle FOR sous dos. C'est juste que je ne vois pas comment résoudre mon problème avec cette solution !!!!


 
Y'a pas l'équivalent du $# en Dos qui compte le nombre d'argument en entrée ? (le for du Bash linux est un foreach et non un for, c'est pour cela que ca marche en bash)

Reply

Marsh Posté le 12-08-2008 à 18:08:41    

Voici le code final pour ceux que ça intéresse :
 
: debut_boucle
IF "%2"=="" GOTO horodatage
set fic=%2
set arg=%arg% %2
 
SHIFT
set /a nbParams+=1
     if not exist "%fic%" (
     goto fin_erreur
     )
goto debut_boucle
 
:horodatage
set datetime=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%
for %%i in (%arg%) do (
     rename %%i %datetime%_%%i
)
goto fin_correct

Reply

Marsh Posté le 12-08-2008 à 18:31:48    

J'codais pendant que tu postais la réponse.
Mon code continue meme si un fichier n'existe pas, sans le prendre en compte pour l'horodatage.
 

Code :
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set rep=C:\test
  4. set acc=0
  5. set acc1=0
  6. if "%1"=="" echo Vous devez specifier des fichiers& pause& goto fin
  7. :verif
  8. if "%1"=="" goto horodatage
  9. if not exist "%rep%\%1" echo Le fichier "%1" n'existe pas& shift& goto verif
  10. set /a acc+=1
  11. set fic%acc%="%1"
  12. shift
  13. goto verif
  14. :horodatage
  15. set /a acc1+=1
  16. set datetime=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%
  17. rename %rep%\!fic%acc1%! %datetime%_!fic%acc1%!
  18. if not %acc% EQU %acc1% goto horodatage
  19. pause
  20. :fin
  21. endlocal

Reply

Marsh Posté le 13-08-2008 à 10:37:30    

Salut BlastKiller,
 
voici mon code complet :
 
set rep=%1
set /A nbParams=0
 
: debut_boucle
IF "%2"=="" GOTO horodatage
set fic=%2
set arg=%arg% %2
 
SHIFT
set /a nbParams+=1
     if not exist "%rep%\%fic%" (
     echo Le fichier %fic% n'existe pas !
     goto fin_erreur
     )
goto debut_boucle
 
:horodatage
set datetime=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%
for %%i in (%arg%) do (
     rename %rep%\%%i %datetime%_%%i
     echo "Horodatage du fichier %%i -> %datetime%_%%i" >>%LOG%
)
goto fin_correct
 
si tu as des question n'hésites pas !!

Reply

Sujets relatifs:

Leave a Replay

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