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

Scripts/Batch Discussion :

For et if exist


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Par défaut For et if exist
    Bonjour,

    je rencontre un problème agaçant avec une boucle for incluant des sous instructions, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Rem initialisation du compteur
    
    set Compteur=0
    
    Rem le dossier "Repertoire" contient le fichier Contenu.txt, et se trouve dans le même répertoire que le batch
    
    cd \Repertoire
    
    Rem pour chaque ligne du fichier Contenu.txt
    
    for /f "tokens=*" %%a in (Contenu.txt) do (
    
    Rem Si le fichier décrit à la ligne lue est présent sur le disque dur :
    if exist "%%a" (
    
    Rem Copier un truc indépendant de %%a du fichier blabla.txt vers le fichier fichier_tiers.txt :
    type blabla.txt >> fichier_tiers.txt
    
    Rem écrire que le fichier de la ligne lue est présent dans le fichier journal.txt
    echo %%a present >> journal.txt
    
    Rem incrémenter de 1 le compteur :
    set /a Compteur=%Compteur%+1
    
    Rem sauter deux lignes dans le fichier fichier_tiers.txt :
    echo. >> fichier_tiers.txt
    echo. >> fichier_tiers.txt
    
    Rem je voudrais qu'il sorte ici s'il a trouvé un fichier -> :fin, sinon continuer la lecture de Contenu.txt
    )
    )
    
    :fin
    le but :

    1.lecture du fichier Contenu.txt dont voici un échantillon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %SystemDrive%\def.txt
    %SystemDrive%\x.exe
    %SystemDrive%\abc.txt
    2. Vérification de la présence du fichier sur le disque dur, lu sur la ligne l de Contenu.txt :
    - si ce fichier est présent, sortir définitivement de la boucle et appliquer les instructions d'après, il ne faut pas que les lignes suivantes soient lues
    - si ce fichier n'est pas présent, passer à la ligne l+1, et ainsi de suite jusqu'à la fin de la lecture ; si toujours rien trouvé, passer à :fin

    J'ai également essayer d'assigner %%a à une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Rem Si le fichier décrit à la ligne lue est présent sur le disque dur :
    if exist "%%a" (
    set %filename%=%%a
    mais à ce niveau, echo %filename% ne renvoie rien, donc le fichier journal.txt est vide.
    Il semblerait qu'en plus du problème initial, les variables d'environnement soient mal tolérées et que C:\ marche mieux que %systemdrive%

    Quelle serait votre approche dans ce genre de circonstance ?

    Merci

  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
    Je n'ai pas bien compris quel était ton problème.

    Quel est l'interêt du compteur si tu veux sortir des que tu trouves un fichier ?


    Ca sans les % autour de filename ça fonctionnera mieux.

    Pour sortir de ton for, un goto fera l'affaire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Par défaut
    Salut,

    Quel est l'interêt du compteur si tu veux sortir des que tu trouves un fichier ?
    le compteur me servira par la suite qui est indépendante de cette portion du batch, ce qui compte c'est qu'il passe de 0 à 1 dans le cas où un fichier de Contenu.txt soit présent sur le disque dur

    autant pour moi c'est une erreur de copier-coller sur le forum, mais ça ne résoud pas le problème

    le souci avec ça, c'est que %filename% n'est pas mémorisé à la sortie de la boucle, et c'est bien ça le problème, ce que je souhaite c'est que le fichier journal.txt soit rempli avec le nom du fichier trouvé sur le dd lors du test dans la boucle for

  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
    Ah ben oui mais tu n'avais pas dis ce qui ne fonctionnait pas.

    Bref

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @echo off
    setlocal enableDelayedExpansion
    
    set Compteur=0
    
    for /f "delims=" %%a in (Contenu.txt) do (
        if exist "%%a" (
            type blabla.txt >> fichier_tiers.txt
            echo %%a present > journal.txt
            set /a Compteur=1
            goto :fin
        )
    )
    
    :fin
    Ceci fonctionne très bien (avec tokens=* aussi d'ailleurs).

    Pour ton compteur, pas la peine de faire un +1 vu qu'il est à 0 avant et que tu ne l'incremente qu'une fois. Si par hasard tu voulais l'incrementer plusieurs fois, ta syntaxe est fausse en plus, il faudrait mettre des ! au lieu de % (en activant les expansions retardées de variables comme je l'ai fait).

    J'ai aussi mis > au lieu de >> pour journal.txt afin d'écraser l'existant.

    Bref je ne vois pas de problème majeur dans ton code, si ça ne marche pas explicite plus clairement ce qu'il te renvoie, dis nous si il rentre dans la boucle ...


    Pour le %SystemDrive%, je n'ai pas testé mais je suppute que les % posent problème.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Par défaut
    Salut,

    merci pour cette réponse qui semble résoudre en partie le pb. En effet, les % de %systemdrive%, %systemroot% semblent gêner.

    Si je mets par exemple dans Contenu.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %systemroot%\abc.txt
    C:\windows\abc.txt
    le test s'arrête sur C:\windows\abc.txt et non pas sur le premier comme attendu. Est-ce que tu as une idée de comment "forcer" la reconnaissance de ces variables d'environnement ?

  6. #6
    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
    Bon alors c'est tiré par les cheveux mais ça marche.
    Il doit y avoir plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @echo off
    setlocal enableDelayedExpansion
    
    for /f "delims=" %%a in (Contenu.txt) do (
    	
         echo %%a | findstr .*  > tmp.work
         set /p filename=<tmp.work
         if exist !filename! (
             echo %%a | findstr .* > journal.txt
             goto :fin
        )
    )
    
    :fin
    del tmp.work
    On utilise le fait que findstr interprete les variables d'environnement lors de son retour.
    Je te laisse adapter à tes besoins.

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

Discussions similaires

  1. Attribute "rel" exists, but can not be used for this element
    Par pasc06 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 27/02/2010, 11h36
  2. Réponses: 0
    Dernier message: 03/12/2008, 16h57
  3. Réponses: 2
    Dernier message: 25/08/2008, 16h37
  4. [PPC][C#][Sql CE] erreur "no data exists for the row/column"
    Par Jessika dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/04/2007, 12h13
  5. [JpGraph] Erreur : Chosen locale file for error messages does not exist
    Par nagrom dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 19/07/2006, 15h15

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