Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1449 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1266999
jdeheyn
Posté le 15-12-2005 à 10:27:20  profilanswer
 

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
mood
Publicité
Posté le 15-12-2005 à 10:27:20  profilanswer
 

n°1267257
jdeheyn
Posté le 15-12-2005 à 13:50:25  profilanswer
 

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
n°1268058
wackevat
Posté le 15-12-2005 à 23:48:45  profilanswer
 

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 ......

n°1268383
jdeheyn
Posté le 16-12-2005 à 13:51:14  profilanswer
 


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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
Problème avec l'installation d'un wiki[HTML] Problème de tableaux avec internet explorer
[GLUT] Probleme avec boucle while[RESOLU][SED] Modifier une chaine avec un caractère mystère
PRoblème de cookieprobleme de pointeur
[CSS] problème de mise en page à l'impression[PHP] Probleme droit écriture
Probleme de date avec php (antidatage ?) 
Plus de sujets relatifs à : [RESOLU] Problème avec un IF imbriqué dans une boucle FOR


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR