[RESOLU] Problème avec un IF imbriqué dans une boucle FOR

Problème avec un IF imbriqué dans une boucle FOR [RESOLU] - Shell/Batch - Programmation

Marsh Posté le 15-12-2005 à 10:27:20    

Bonjour,
 
Je rencontre actuellement un soucis avec un batch dans lequel j'utilise un test 'IF' dans une boucle 'FOR'.
Je m'explique :
 
- J'ai deux fichiers contenant du texte, JRN_ELEC.FIC dont le contenu est (chacune des lignes correspond à un nom de fichier) :

1-20051021
1-20051020_20051130
1-20051020
1-20051019
1-20051018


et le fichier JRN_ELEC.VAR dont le contenu est :

------------------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
-----------------------------------  
1-20051020_20051130                                                            
 
1-20051020                                                                    
 
(2 rows affected)


- Mon script batch doit vérifier s'il y a dans le fichier JRN_ELEC.VAR un ou plusieurs nom présent dans le fichier JRN_ELEC.FIC.
Pour se faire, mon script compare chacune des lignes du fichier JRN_ELEC.FIC avec le contenu de JRN_ELEC.VAR, et s'il trouve une même valeur dans les deux fichiers, il exécute la copie du fichier en question d'un endroit vers un autre.
Voici le scrit :

for /f "delims=" %%a in ('type JRN_ELEC.FIC') do (
echo Fichier à copier : %%a
findstr "%%a" JRN_ELEC.VAR
echo Errorlevel : %errorlevel%
if %errorlevel%==0 XCOPY /C /E /F /I /H /R /Y E:\REP1\%%a\*.* E:\REP2\%%a
echo Fichier traité : %%a
)


Mon incompréhension : et bien, quelque soit la valeur de %%a (elle change bien à chaque passage dans ma boucle), j'ai toujours la même valeur pour %errorlevel%. Et il semblerait que cette valeur reste la même que celle qui a été trouvée lors du premier passage dans la boucle.
 
Donc, je ne comprends pas pourquoi cette valeur %errorlevel% n'évolue-t-elle pas, et que ma clause 'IF' réagisse de la même manière pendant tout le déroulement du script.
Si quelqu'un a une idée ...

 
 
Ci-dessous la capture du déroulement de mon script (sous Windows 2000) :

C:\sauvegardes>for /F "delims=" %a in ('type JRN_ELEC.FIC') do (
echo Fichier à copier : %a  
 findstr "%a" JRN_ELEC.VAR  
 echo Errorlevel : 1  
 if 1 == 0 XCOPY /C /E /F /I /H /R /Y E:\REP1\%a\*.* E:\REP2\%a  
 echo Fichier traité : %a  
)  
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051021  
 findstr "1-20051021" JRN_ELEC.VAR  
 echo Errorlevel : 1  
 if 1 == 0 XCOPY /C /E /F /I /H /R /Y E:\REP1\1-20051021\*.* E:\REP2\1-20051021  
 echo Fichier traité : 1-20051021  
)  
Fichier à copier : 1-20051021
Errorlevel : 1
Fichier traité : 1-20051021
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051020_20051130  
 findstr "1-20051020_20051130" JRN_ELEC.VAR  
 echo Errorlevel : 1  
 if 1 == 0 XCOPY /C /E /F /I /H /R /Y E:\REP1\1-20051020_20051130\*.* E:\REP2\1-20051020_20051130  
 echo Fichier traité : 1-20051020_20051130  
)  
Fichier à copier : 1-20051020_20051130
 1-20051020_20051130                                                            
Errorlevel : 1
Fichier traité : 1-20051020_20051130
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051020  
 findstr "1-20051020" JRN_ELEC.VAR  
 echo Errorlevel : 1  
 if 1 == 0 XCOPY /C /E /F /I /H /R /Y E:\REP1\1-20051020\*.* E:\REP2\1-20051020  
 echo Fichier traité : 1-20051020  
)  
Fichier à copier : 1-20051020
 1-20051020_20051130                                                            
 1-20051020                                                                    
Errorlevel : 1
Fichier traité : 1-20051020
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051019  
 findstr "1-20051019" JRN_ELEC.VAR  
 echo Errorlevel : 1  
 if 1 == 0 XCOPY /C /E /F /I /H /R /Y E:\REP1\1-20051019\*.* E:\REP2\1-20051019  
 echo Fichier traité : 1-20051019  
)  
Fichier à copier : 1-20051019
Errorlevel : 1
Fichier traité : 1-20051019
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051018  
 findstr "1-20051018" JRN_ELEC.VAR  
 echo Errorlevel : 1  
 if 1 == 0 XCOPY /C /E /F /I /H /R /Y E:\REP1\1-20051018\*.* E:\REP2\1-20051018  
 echo Fichier traité : 1-20051018  
)  
Fichier à copier : 1-20051018
Errorlevel : 1
Fichier traité : 1-20051018


Message édité par jdeheyn le 16-12-2005 à 13:51:57
Reply

Marsh Posté le 15-12-2005 à 10:27:20   

Reply

Marsh Posté le 15-12-2005 à 13:50:25    

Bon, j'ai apporté quelques modifications à la structure de mon script : je l'ai divisé en deux fichiers TEST.CMD et TEST1.CMD.
 
Voici leur contenu :
 
TEST.CMD

for /f "delims=" %%a in ('type JRN_ELEC.FIC') do (
echo Fichier à copier : %%a
test2.cmd %%a
echo Fichier traité : %%a
)


 
TEST2.CMD

findstr "%1%" JRN_ELEC.VAR
echo Errorlevel : %errorlevel%
if %errorlevel%==0 (
XCOPY /E /C /I /F /H /R /Y "E:\REP1\%1%\*.*" "E:\REP2\%1%"
)


 
Maintenant le test 'IF' se fait correctement, et la valeur de %errorlevel% évolue correctement.
Mais j'ai un problème avec la commande XCOPY. Je ne comprends pas pourquoi, lors du déroulement du script la destination de mes fichier est tronquée. Je vous mets le déroulement ci-dessous, vous verrez par vous-même :


C:\sauvegardes>for /F "delims=" %a in ('type JRN_ELEC.FIC') do (
echo Fichier à copier : %a  
 test2.cmd %a  
 echo Fichier traité : %a  
)  
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051021  
 test2.cmd 1-20051021  
 echo Fichier traité : 1-20051021  
)  
Fichier à copier : 1-20051021
 
C:\sauvegardes>findstr "1-20051021" JRN_ELEC.VAR  
 
C:\sauvegardes>echo Errorlevel : 1  
Errorlevel : 1
 
C:\sauvegardes>if 1 == 0 (XCOPY /E /C /I /F /H /R /Y "E:\REP1\1-20051021\REP2\1-20051021" )  
Fichier traité : 1-20051021
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051020_20051130  
 test2.cmd 1-20051020_20051130  
 echo Fichier traité : 1-20051020_20051130  
)  
Fichier à copier : 1-20051020_20051130
 
C:\sauvegardes>findstr "1-20051020_20051130" JRN_ELEC.VAR  
 1-20051020_20051130                                                            
 
C:\sauvegardes>echo Errorlevel : 0  
Errorlevel : 0
 
C:\sauvegardes>if 0 == 0 (XCOPY /E /C /I /F /H /R /Y "E:\REP1\1-20051020_20051130\REP2\1-20051020_20051130" )  
0 fichier(s) copi‚(s)
Fichier traité : 1-20051020_20051130
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051020  
 test2.cmd 1-20051020  
 echo Fichier traité : 1-20051020  
)  
Fichier à copier : 1-20051020
 
C:\sauvegardes>findstr "1-20051020" JRN_ELEC.VAR  
 1-20051020_20051130                                                            
 1-20051020                                                                    
 
C:\sauvegardes>echo Errorlevel : 0  
Errorlevel : 0
 
C:\sauvegardes>if 0 == 0 (XCOPY /E /C /I /F /H /R /Y "E:\REP1\1-20051020\REP2\1-20051020" )  
0 fichier(s) copi‚(s)
Fichier traité : 1-20051020
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051019  
 test2.cmd 1-20051019  
 echo Fichier traité : 1-20051019  
)  
Fichier à copier : 1-20051019
 
C:\sauvegardes>findstr "1-20051019" JRN_ELEC.VAR  
 
C:\sauvegardes>echo Errorlevel : 1  
Errorlevel : 1
 
C:\sauvegardes>if 1 == 0 (XCOPY /E /C /I /F /H /R /Y "E:\REP1\1-20051019\REP2\1-20051019" )  
Fichier traité : 1-20051019
 
C:\sauvegardes>(
echo Fichier à copier : 1-20051018  
 test2.cmd 1-20051018  
 echo Fichier traité : 1-20051018  
)  
Fichier à copier : 1-20051018
 
C:\sauvegardes>findstr "1-20051018" JRN_ELEC.VAR  
 
C:\sauvegardes>echo Errorlevel : 1  
Errorlevel : 1
 
C:\sauvegardes>if 1 == 0 (XCOPY /E /C /I /F /H /R /Y "E:\REP1\1-20051018\REP2\1-20051018" )  
Fichier traité : 1-20051018


 
Donc le E:\ définissant l'unité de destination disparait de la commande XCOPY.
Comment cela est-il possible ????


Message édité par jdeheyn le 15-12-2005 à 13:52:23
Reply

Marsh Posté le 15-12-2005 à 23:48:45    

Tu as des guillemets de trop. Essaie %~1 au lieu de %1% pour xcopy.

Code :
  1. XCOPY /E /C /I /F /H /R /Y "E:\REP1\%~1\*.*" "E:\REP2\%~1"


 
Pour la valeur "erronée" de errorlevel, c'est l'histoire de l'expansion retardée. Fais :

Code :
  1. set /?


pour l'explication et les exemples.
 
En résumé, il fallait écrire :

Code :
  1. setlocal enableExtensions enableDelayedExpansion
  2. ..... blablabla ......
  3. echo Errorlevel : !errorlevel!
  4. if !errorlevel!==0 xcopy ..... blablabla ......
  5. ..... blablabla ......
  6. endlocal


 
Enfin, tes deux batch séparés peuvent être combinés en un en utilisant en appelant une procédure (call :label)
 

Code :
  1. ..... blablabla ......
  2. for /f "delims=" %%a in ('type JRN_ELEC.FIC') do (
  3. echo Fichier à copier : %%a
  4. call :test2 %%a
  5. echo Fichier traité : %%a
  6. )
  7. goto suivant
  8. :test2
  9. findstr "%1%" JRN_ELEC.VAR
  10. echo Errorlevel : %errorlevel%
  11. if %errorlevel%==0 (
  12. XCOPY /E /C /I /F /H /R /Y "E:\REP1\%~1\*.*" "E:\REP2\%~1"
  13. )
  14. goto :eof
  15. :suivant
  16. ..... blablabla ......

Reply

Marsh Posté le 16-12-2005 à 13:51:14    


Merci nglechau pour ton aide, ça m'a permis de résoudre tous mes problèmes.
 

Reply

Sujets relatifs:

Leave a Replay

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