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 :

Bizarre "goto" dans boucle "for" impossible [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 52
    Par défaut Bizarre "goto" dans boucle "for" impossible
    bonjour (bonsoir),

    voici l'extrait de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FOR /f "tokens=1-26 delims=	" %%a in (%fichier_listing%) do (
    if "%%a" NEQ "%name_system%" goto fin_main_boucle
    .....
    : fin_main_boucle
    )
    ==> strictement impossible de mettre un label goto à l'intérieur d'une boucle for.

    demande de l'aide SVP
    je viens de perdre 2H00

  2. #2
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    salut,

    sur ton étiquette, t'as mis un espace devant le nom après les ":"

    aussi, cette manière de procéder ne se fait pas...

  3. #3
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    salut,

    si on mets une etiquette on n'est plus dans le contexte de la boucle forindo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @echo off
    for %%a in (a b c) do (  
      echo 1- %%a
      goto :suite
      :suite
      echo 2- %%a
    ) 
    pause
    à première vu celà casse la boucle mais si observe de plus près on constate que la boucle se deroiule normalement mais le saut goto trouble l''execution du code car on alterne entre contexte de boucle et contexte hors boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off
    for /l %%a in ( 1 1 100000) do (  
      echo 1- %%a
      goto :suite
      :suite
      echo 2- %%a
    ) 
    pause

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 52
    Par défaut
    Merci "I'm_HERE"

    je suis assez d'accord avec toi,

    mais alors comment y remédier si je souhaite par exemple
    sauter une itération,
    sauter une fois ou plusieurs fois le corps de la boucle selon une condition défini ?

    parce là ce qui se passe c'est que la fenêtre se ferme brusquement avec le goto

    merci de ton aide

  5. #5
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Salut,

    Tu traites tout dans ta boucle comme te l'a montré I'm Here ()
    Ou sinon de cette manière ça devrait également fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FOR /f "tokens=1-26 delims= " %%a in (%fichier_listing%) do (call:traite %%a)
    goto:eof
    
    :traite
    if "%1" NEQ "%name_system%" goto:fin_main_boucle
    goto:eof
    
    :fin_main_boucle
    Echo FIN_MAIN_BOUCLE

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 52
    Par défaut
    merci mais je ne peut pas m'en servir car dans mon fichier %fichier_listing%
    je ne sais jamais combien j'ai de %%a %%b %%c .....
    et donc les %1 %2 %3 .... vont beaucoup m'embetter

    dommage car je dois appeler mon label à l'intérieur de la boucle for

    cela dit je n'ai pas très bien compris la methode et le code proposé de "i'm_here"

  7. #7
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    rien ne t'interdit de faire des appels (call) ou des branchements (goto) depuis le corps de ta boucle for, mais l'étiquette doit être placée en dehors.

  8. #8
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    Apparement chaque élément d'une ligne de ton Fichier_Listing est traité
    comme un argument.

    Donc tu peux très bien mettre un autre "FOR" qui analyse chaque élément de la ligne en cours. Sans te soucier du nombre d'argument.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FOR /f "delims=" %%a in (%fichier_listing%) do (
          FOR %%b in (%%a) do (if "%%b" NEQ "%name_system%" call:fin_main_boucle))
    goto:eof
    
    :fin_main_boucle
    Echo FIN_MAIN_BOUCLE
    Voilà basiquement l'idée...

    Si le numéro de ligne est important pour toi mets un compteur.
    Et si tu ne veux pas de call tu traite directement dans le 2eme FOR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FOR /f "delims=" %%a in (%fichier_listing%) do (
          FOR %%b in (%%a) do (if "%%b" NEQ "%name_system%" Echo FIN_MAIN_BOUCLE))
    Sans savoir quel traitement tu veux faire et sur quoi tu dois le faire c'est assez compliqué de t'aider....


  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 52
    Par défaut
    oui effectivement je traite chaque ligne du fichier txt pour la boucle for comme des arguments et ils doivent à juste titre rester intègres.

    je viens de passer 2 heures à tenter de transmettre tous les arguments de façon intègre entre la boucle (%%a) for et la fonction call (%1 %2 %3 ...), seulement dès qu'il y a un espace alors ils faut mettre des guillemets mais si je le fais alors dès que j'ai un path avec guillement au sein même de l'argument %%a (issu du fichier txt) alors ça fausse tout.

    d'où pourquoi je souhaite le moins possible manipuler les
    %%x … et les %1 %2…

    Mon but final étant selon une petite condition défini de pourvoir sauter du code et de gagner en ressource temps système,
    Le GOTO semblait donc évident mais impossible dans une boucle for,
    Remplacer le GOTO par un IF suivi d’une longue parenthèse ne m’aurait pas aidé non plus car j’observe que BATCH exécute ou consacre du temps systeme bêtement (« en mode caché ») l’intérieur de la parenthèse même si la condition n’est pas satisfaite.
    mais alors effectivement sous imbriquer une autre boucle for était une solution qui permet de sauter du code dans une boucle for

    J’apprécie beaucoup BATCH peut être par fainéantise de m’intéresser à ses successeurs et parce que jusque là je m’en sors toujours (quoi que je me demande si je ne serais pas en train de gaspiller mon temps avec ce dinosaure) mais j’ai vraiment l’impression de voir de plus en plus les limites de ce code et il serait temps que j’évolue (sachant que j’ai déjà étudié C++ et JAVA )

    merci encore de votre aide
    sujet résolu




    Voici mon code finale

    Code BATCH : 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
     
    setlocal ENABLEDELAYEDEXPANSION
    set name_system=%COMPUTERNAME%
     
    FOR /f "tokens=1-26 delims=	" %%a in (%fichier_listing%) do (
    set sys_ok=0
    if "%%a" == "%name_system%" set sys_ok=1
    if "%%a" == "all" 	set sys_ok=1
     
    rem name / type / date / heure / action à réaliser
    set arg_name_sys=%%a
    set arg_type_cmd=%%b
    set arg_date_jour=%%c
    set arg_date_heure=%%d
    set arg_ligne_cmd=%%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%u %%r %%s %%t %%v %%w %%x %%y %%z
     
    if "!sys_ok!" == "1" for %%b in (%%a) do (
     
    echo ====!arg_name_sys!======!arg_type_cmd!====!arg_date_jour!===!arg_date_heure!====!arg_ligne_cmd!
    ….. mon code qui pour info est un batch qui remplace mon gestionnaire de tache via un simple fichier.txt où les champs sont espacé par des tabulations
     
    )
    )

  10. #10
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Y'a pas mal de choses à modifier, mais déjà en ligne 4 tu peux faire une grosse optimisation en remplaçant %fichier_listing% par 'findstr /i "^all ^%computername%" "%fichier_listing%"' à adapter bien sûr si les noms de PC risquent de contenir des espaces. Pour le reste, je te laisse voir, au besoin, avec les autres membres.

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

Discussions similaires

  1. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51
  2. [Fonction] Quote et guillemet dans un textarea
    Par ddelec24 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/03/2007, 15h51
  3. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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