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 :

BATCH : Boucle FOR qui ne boucle pas ?!


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut BATCH : Boucle FOR qui ne boucle pas ?!
    Bonjour à tous,

    Je rencontre un problème dans le code ci-dessous :
    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
    :: Variable "liste" contenant les noms de processus à tuer
    SET listeProcessus=Notepad RocketDock Toto
    ECHO %listeProcessus%
    
    
    :: On démarre deux Notepad, pour le test de la deuxième boucle FOR
    Start /min Notepad
    Start /min Notepad
    
    
    :: Pour chaque nom de processus dans %listeProcess%; on liste les processus
    :: portant ce nom. On récupére les lignes, exceptées les 3 premières (en-tête
    :: du résultat de PSLIST), contenant ce nom de processus.
    :: Le token 1 contient le nom du processus, le token 2 contient son PID.
    :: Si le PID n'est pas renseigné, c'est qu'aucun processus de ce nom n'a été
    :: trouvé : dans ce cas on ne fait rien, sinon on détruit le process.
    FOR /F %%A IN ( 'ECHO %listeProcessus%' ) DO (
        ECHO %%A
        FOR /F "TOKENS=1,2 SKIP=3" %%O IN ( 'PSLIST -e %%A' ) DO (
            ECHO %%O %%P
            PSKILL -t %%P
        )
    )
    
    :: Fin du script
    :END
    Le problème est simple : la première boucle FOR ne boucle pas !!
    Le premier ECHO montre que %listeProcessus% semble correcte, et pourtant...
    Pour la deuxième, pas de problème (les deux process Notepad sont bien tués), mais après le deuxième PSKILL, la boucle se termine immédiatement : le ECHO %%A (qui devrait renvoyer "RocketDock") n'est pas exécuté.

    Je suis sûr que le problème est très simple, mais je ne vois rien !?

    Merci d'avance pour vos lumières !


    EDIT : si besoin, la page à partir de laquelle télécharger PSKILL et PSLIST : http://www.sysinternals.com/ntw2k/fr.../pstools.shtml

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    essais ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    :: Variable "liste" contenant les noms de processus … tuer
    SET listeProcessus=(Notepad,RocketDock,Toto)
    
    ...
     
    :: trouv‚ : dans ce cas on ne fait rien, sinon on d‚truit le process.
    FOR %%A IN %listeProcessus% DO (
    ...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci de te pencher sur mon cas !

    En l'état, ça ne marche pas non plus : l'exécution du script retourne "Le système ne peut trouver le fichier RocketDock." (normal, RocketDock est une chaîne de caractères).

    En remplaçant IN %listeProcessus% par IN ( 'ECHO %listeProcessus%'), une nouvelle erreur est levée : ' était inattendu.. Après enquête, c'est à cause des parenthèses dans la chaîne listeProcessus. Et en enlevant les parenthèses (on se contente donc de remplacer le délimiteur par une virgule), même chose qu'auparavant : un seul tour de boucle.

    J'ai aussi inversé les noms des processus à tuer dans la liste : ce n'est pas lié au nom du processus, le premier (et unique) tour de boucle est toujours effectué.
    Je sèche complètement là ! %ERRORLEVEL% vaut toujours 0 en fin de script (ce qui est êut-être normal, je ne sais pas, maîtrisant assez peu le BATCH DOS).

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Ceci fonctionne sur mon poste:
    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
    @echo off
    :: Variable "liste" contenant les noms de processus … tuer
    SET listeProcessus=(Notepad,RocketDock,Toto)
    ECHO %listeProcessus%
     
    :: On d‚marre deux Notepad, pour le test de la deuxiŠme boucle FOR
    Start /min Notepad
    Start /min Notepad
     
    :: Pour chaque nom de processus dans %listeProcess%; on liste les processus
    :: portant ce nom. On r‚cup‚re les lignes, except‚es les 3 premiŠres (en-tˆte
    :: du r‚sultat de PSLIST), contenant ce nom de processus.
    :: Le token 1 contient le nom du processus, le token 2 contient son PID.
    :: Si le PID n'est pas renseign‚, c'est qu'aucun processus de ce nom n'a ‚t‚
    :: trouv‚ : dans ce cas on ne fait rien, sinon on d‚truit le process.
    FOR %%A IN %listeProcessus% DO (
        ECHO %%A
        FOR /F "TOKENS=1,2 SKIP=3" %%O IN ( 'C:\Tools\sysinternal\Pstools\PSLIST -e %%A' ) DO (
            ECHO %%O %%P
            C:\Tools\sysinternal\Pstools\PSKILL -t %%P
        )
    )
     
    :: Fin du script
    :END
    (Notepad,RocketDock,Toto)

    Notepad
    pslist v1.28 - Sysinternals PsList
    Copyright ® 2000-2004 Mark Russinovich
    Sysinternals
    notepad 3948

    PsKill v1.12 - Terminates processes on local or remote systems
    Copyright (C) 1999-2005 Mark Russinovich
    Sysinternals - www.sysinternals.com
    Process 3948 killed.
    notepad 2504

    PsKill v1.12 - Terminates processes on local or remote systems
    Copyright (C) 1999-2005 Mark Russinovich
    Sysinternals - www.sysinternals.com
    Process 2504 killed.

    RocketDock
    pslist v1.28 - Sysinternals PsList
    Copyright ® 2000-2004 Mark Russinovich
    Sysinternals

    Toto
    pslist v1.28 - Sysinternals PsList
    Copyright ® 2000-2004 Mark Russinovich
    Sysinternals

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    What the hell ?! Ton script marche chez moi aussi :/

    Il doit y avoir une bête coquille de typo dans mon script ?!
    Je creuse ça, et je reviens dès que j'ai trouvé de quoi il s'agit

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Au final, je ne comprends toujours pas pourquoi la syntaxe que j'ai utilisée ne fonctionne pas.

    En revanche, je sais pourquoi ça ne marchait pas chez moi, en suivant tes conseils : j'avais laissé le commutateur "/F" devant le FOR.

    Au final, j'utilise un fichier texte qui contient les noms des processus à tuer, à raison d'un par ligne : le fichier est parcouru dans la première boucle FOR, et les processus correspondants sont tués dans la deuxième.

    Je reste quand même curieux de comprendre ce qui cloche dans la première syntaxe (du type FOR /F %%A IN ( 'ECHO %liste%' ) DO [...] ), avec %liste% une chaîne contenant les noms des processus séparés par des espaces... Même si je n'ai guère de temps à y consacrer !

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par agyar
    Au final, je ne comprends toujours pas pourquoi la syntaxe que j'ai utilisée ne fonctionne pas.
    Je viens à nouveau d'essayer avec la version de ton 1er post et cela fonctionne.Tout en sachant que lors de mon premier essaie j'avais bien le même pb que celui énoncé
    Un caratère de contrôle dans le fichier ? le format du fichier (ansi,utf-8,...), un paramètrage de la base de resgitre ???

Discussions similaires

  1. [XL-2010] Boucle For qui ne fonctionne pas pour toutes les valeurs
    Par pleskyd dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 13/02/2012, 15h16
  2. Réponses: 8
    Dernier message: 01/06/2010, 11h43
  3. une boucle for qui ne fonctionne pas
    Par piffeo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2008, 21h52
  4. Boucle for qui ne boucle pas !
    Par polothentik dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 18/04/2008, 10h50
  5. boucle for qui ne marche pas
    Par Invité dans le forum Langage
    Réponses: 16
    Dernier message: 12/06/2006, 10h59

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