[Batch]Variables pas mises à jour dans un FOR

Fermé
Lucie - 3 mai 2007 à 14:20
 Lucie - 4 mai 2007 à 09:14
Bonjour,

j'ai un problème avec le mroceau de script Batch suivant :

#############################
dir %REP%\mantis_* /a:d /b >> %REP%\tmp_liste.txt
for /F "tokens=1 delims=mantis_" %%A in (C:\tmp\tmp_liste.txt) do (
echo %%A
set TEMP=%%A
set AAAA_IT=%TEMP:~0,4%
echo %AAAA_IT%
set MM_IT=%TEMP:~4,2%
echo %MM_IT%
set JJ_IT=%TEMP:~6,2%
echo %JJ_IT%
if AAAA_IT LSS AAAA_LIM (
echo %REP%\mantis_%AAAA_IT%%MM_IT%%JJ_IT%_%TEMP:~9,6%
rem rmdir /s %REP%\mantis_%AAAA_IT%%MM_IT%%JJ_IT%_%TMP_VAR:~15,6% >> %REP_TO%\clean_up_mantis.log
)
)
###########################

Concrétement, c'est censé parcourir chaque ligne de la liste des répertoires tmp_liste.txt. Les noms des répertoires ont un format "mantis_AAAAMMJJ_HHMMSS".

Seulement, quand j'affiche %%A, pas de problème, toutes les lignes de la liste sont parcourues. En revanche, %AAAA_IT% par exemple ne change jamais et reste à "2007".

Au cours de mes différentes bidouilles pour faire marcher ce script, j'ai même cru comprendre que la valeur que prenaient mes variables définies à partir de %%A prenaient en réalité toujours les valeurs attendues, mais correspondant au dernier repertoire de la liste, mais celles correspondant à la fois précédente où le script a été lancé!

Voilà, j'espère avoir été claire... j'ai retourné ça dans tous les sens et je ne m'en sors pas.

Merci d'avance!
A voir également:

3 réponses

Un élément de réponse! (je me répond à moi même...)
Apparement, la commande For n'aime pas les parenthèses avec plusieurs commandes à l'intérieur après le "do".

Il faut donc tricher en créant une boucle externe:

for /F "tokens=* delims=mantis_" %%A in ('dir %REP%\mantis_* /a:d /b') do call ::BOUCLE1 %%A

:BOUCLE1
set B=%1
if defined B (
set AAAA_IT=
set MM_IT=
set JJ_IT=
set /a AAAA_IT=%B:~0,4%
echo %AAAA_IT%
set MM_IT=%B:~4,2%
echo %MM_IT%
set JJ_IT=%B:~6,2%
echo %JJ_IT%
if AAAA_IT LSS AAAA_LIM (
echo %REP%\mantis_%B%
rem rmdir /s %REP%\mantis_%B% >> %REP_TO%\clean_up_mantis.log
)
set B=
)
goto :EOF

Voila, maintenant, la liste est bien parcourue et ne bloque pas sur un seul répertoire, mais ce n'est qu'un début, car il y a toujours un problème.

En effet, les AAAA_IT, MM_IT et JJ_IT que j'affiche sont décalés: c'est à dire que les années, mois et jours que j'affiche à chaque fois correspondent en fait au répertoire que j'ai traité dans la boucle suivante (et ceux assignés lors du tout premier passage dans la boucle correspondent au dernier passage dans la boucle la dernière fois que j'ai lancé le programme).

Quelqu'un peut-il m'aider?
0
Erratum :

"c'est à dire que les années, mois et jours que j'affiche à chaque fois correspondent en fait au répertoire que j'ai traité dans la boucle suivante"

Il fallait lire :

"c'est à dire que les années, mois et jours que j'affiche à chaque fois correspondent en fait au répertoire que j'ai traité dans la boucle précédente"

Mes excuses
0
ok, bon, ça marchouille maintenant. Le problème, c'était apparemment que le IF n'aimait pas les muultiples commandes entre parenthèses non plus.

Il faut donc encore utiliser une boucle:

:BOUCLE1
set B=%1
if defined B goto BOUCLE2
:FIN2
goto :EOF

:BOUCLE2
set AAAA_IT=%B:~0,4%
echo %AAAA_IT%
set MM_IT=%B:~4,2%
echo %MM_IT%
set JJ_IT=%B:~6,2%
echo %JJ_IT%
if AAAA_IT LSS AAAA_LIM (
echo %REP%\mantis_%B%
rem rmdir /s %REP%\mantis_%B% >> %REP_TO%\clean_up_mantis.log
)
goto FIN2

et donc là, plus de décalage :)
0