IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Batch - Deux boucle For imbriquées plus un FC


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif Avatar de Lorponos
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 243
    Par défaut Batch - Deux boucle For imbriquées plus un FC
    Bonjour, je suis en train de créer un script batch un peu spécial et j'ai un petit souci, au début j'étais parti avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Fc /l /n "%RepSource%\notepad.exe" "%WinDir%\System32\notepad.exe" >nul 
    If not %ErrorLevel%== 0 ( xcopy "%RepSource%\notepad.exe" "%windir%\System32\dllcache\*.*" /S /I /H /Q /R /Y & xcopy "%RepSource%\notepad.exe" "%windir%\System32" /S /I /H /Q /R /Y & xcopy %RepSource%\notepad.exe "%windir%\*.*" /S /I /H /Q /R /Y & color 0E 
    ) else ( echo Mise … jour OK pour Bloc Note )
    Ce scipt compare un fichier stoker dans un répertoire source avec un autre fichier dans le répertoire System32 de Windows, si les fichiers sont différents la variable %ErrorLevel% déclenche la copie du fichier dans le répertoire source sur le fichier du répertoire System32, mais ce script c'est pour un seul fichier, maintenant je veux faire quelque un script qui test plusieurs fichiers, grâce à une boucle For, voilà où j'en suis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For /r "%RepSource%\" %%i In (*.*) Do ( 
    For /f "delims=" %%j In ('Fc /l /n "%%i" "%WinDir%\System32\%%~nxi"') Do xcopy "%%i" "%windir%\System32\dllcache\*.*" /S /I /H /Q /R /Y & xcopy %%i" "%windir%\System32" /S /I /H /Q /R /Y & xcopy %%i "%windir%\*.*" /S /I /H /Q /R /Y & color 0E 
    )
    Là ce que je veus plus précisément, c'est que le script compare tous les fichiers stockés dans le répertoire source avec les fichiers de même noms dans le répertoire System32, j'ai donc fais une première boucle For qui fouille le répertoire source, puis une deuxième boucle For imbriquée qui elle compare les fichiers listés dans le répertoire source avec les fichiers de même noms dans le répertoire System32, ce que je n'arrive pas à faire c'est faire en sorte que la deuxième boucle For ne copie que les fichier dans la source et la cible sont différentes, la variable %ErrorLevel% ne fonctionne pas entre les parenthèses d'une boucle For, donc la je ne sais pas quoi faire, quelqu'un saurait-il m'éclairer ?

  2. #2
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Ca peut etre ? En bidouillant un peu le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For /r "%RepSource%\" %%i In (*.*) Do (
       Fc /l /n "%%i" "%WinDir%\System32\%%~nxi" | findstr FC > tmp.txt
       if "FC : aucune..."==<tmp.txt ( REM pas de copie 
       ) else ( REM copie )
    )

    Sinon à tester mais pour le %ErrorLevel% qui marche pas, essaye avec les expansions retardées de variables.

  3. #3
    Inactif Avatar de Lorponos
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 243
    Par défaut
    Citation Envoyé par Drizzt [Drone38]
    Ca peut etre ? En bidouillant un peu le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For /r "%RepSource%\" %%i In (*.*) Do (
       Fc /l /n "%%i" "%WinDir%\System32\%%~nxi" | findstr FC > tmp.txt
       if "FC : aucune..."==<tmp.txt ( REM pas de copie 
       ) else ( REM copie )
    )

    Sinon à tester mais pour le %ErrorLevel% qui marche pas, essaye avec les expansions retardées de variables.
    Bonjour et merci beaucoup

    J'ai essayer d'adapter un peut ton code, mais il ne fonctionne pas.
    Dans ton code cette ligne est elle sensé créer le fichier.txt uniquement si les fichiers sont différent ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Fc /l /n "%%i" "%WinDir%\System32\%%~nxi" | findstr FC > tmp.txt
    Que dois-je faire avec les expansions retardées de variables ?

  4. #4
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Nop mon code cree le fichier à chaque fois et si une ligne commençant par FC est présente la met dedans.
    Sinon il cree un fichier vide.

    Les lignes commençant par FC sont des lignes d'informations de la commande FC.
    Ex: FC : impossible d'ouvrir test.txt - Ce fichier ou dossier n'existe pas
    ou FC : aucune différence trouvée

    C'est cette deuxieme chaine qui t'interesse.
    Tu dois donc tester si ce qu'il y a dans le fichier est égal à cette chaine ou pas. Normalement le fichier ne doit contenir qu'une seule ligne (à confirmer cpdt je ne connais pas bien la commande fc) donc tu peux l'utiliser directement avec < dans un test.
    Tu pourrais juste tester si le fichier est vide ou pas (pas de ligne commençant par FC si les fichiers sont differents) mais tu louperais les cas d'erreur comme celui ou le fichier n'existe pas.


    Pour les expansions retardees de variable je ne sais pas du tout si ça marchera mais pour tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocal ENABLEDELAYEDEXPANSION
    Ensuite au lieu de mettre %ErrorLevel% tu utilises !ErrorLevel!.

    Pour info les expansions retardés de variables evite que tes variables soient remplacés par leur valeurs trop tot.
    Ex extrait de l'aide de la commande SET:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set VAR=avant
    if "%VAR%" == "avant" (
        set VAR=après;
        if "%VAR%" == "après" @echo Cela marche si vous lisez ce message
    )
    --> Ne fonctionne pas car %VAR% est remplacé dès la lecture de la commande IF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     set VAR=avant
     if "%VAR%" == "avant" (
         set VAR=après
         if "!VAR!" == "après" @echo Cela marche si vous lisez ce message
     )
    --> Fonctionne car !VAR! est remplacé à sa lecture.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais ça ne marche que si les extensions sont activées.

    J'avais fait ce code pour tester (préambule d'un de mes batchs):
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    REM on vérifie le mode "Delayed Variable Expansion" qui est nécessaire pour la boucle for
     
    SET testDelay=avant
    IF "%testDelay%" == "avant" (
    	SET testDelay=apres
    	IF NOT "!testDelay!" == "apres" (
    		ECHO Le mode "Delayed Variable Expansion" doit etre active
    		ECHO "(option CMD /V:ON)"
    		EXIT /B 1
    	)
    )
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Inactif Avatar de Lorponos
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 243
    Par défaut
    Citation Envoyé par Médinoc
    Mais ça ne marche que si les extensions sont activées.

    J'avais fait ce code pour tester (préambule d'un de mes batchs):
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    REM on vérifie le mode "Delayed Variable Expansion" qui est nécessaire pour la boucle for
     
    SET testDelay=avant
    IF "%testDelay%" == "avant" (
    	SET testDelay=apres
    	IF NOT "!testDelay!" == "apres" (
    		ECHO Le mode "Delayed Variable Expansion" doit etre active
    		ECHO "(option CMD /V:ON)"
    		EXIT /B 1
    	)
    )
    C'est quoi un préambule ?

  7. #7
    Inactif Avatar de Lorponos
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 243
    Par défaut
    J'ai modifier un peu le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For /r "%RepSource%\" %%i In (*.*) Do (
     Fc /l /n "%%i" "%WinDir%\System32\%%~nxi" | findstr FC  > "fc.txt"
      For /f "tokens=2 delims=:" %%j In ('Type "fc.txt"') Do (
        If /i "%%i"==" aucune diff‚rence trouv‚e" ( 
         echo  OK  
        ) else ( 
         echo  Diff‚rent 
       )
      )
    )
    Mais c'est pas encore ça, cette partie du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        If /i "%%i"==" aucune diff‚rence trouv‚e" ( 
         echo  OK  
        ) else ( 
         echo  Diff‚rent 
       )
    Doit afficher "OK" si la chaîne "aucune diff‚rence trouv‚e" est détectée dans le fichier "fc.txt", et afficher "Diff‚rent" si la chaîne "aucune diff‚rence trouv‚e" n'est pas détectée, mais que la chaîne soit détectée ou pas le résultat est toujours "Diff‚rent".

    Vois tu ce qui ne va pas ?

  8. #8
    Inactif Avatar de Lorponos
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 243
    Par défaut
    Ah, désolé pour mon message précédent, il falait mettre %%j au lieu de %%i:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        If /i "%%J"==" aucune diff‚rence trouv‚e" ( 
         echo  OK  
        ) else ( 
         echo  Diff‚rent 
       )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/07/2014, 10h25
  2. deux boucles for non imbriquées
    Par ebenmous dans le forum Langage
    Réponses: 3
    Dernier message: 24/06/2011, 11h53
  3. Sortir de deux boucles FOR-END imbriquées
    Par Nabuchodonosor15 dans le forum MATLAB
    Réponses: 5
    Dernier message: 31/08/2009, 09h58
  4. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  5. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo