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 :

if imbriqués, perte de données dans les variables '?' [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut if imbriqués, perte de données dans les variables '?'
    Bonjour,

    Ça fait deux heures que j'essaie de résoudre le mystère, mais décidément je suis dans une impasse. En gros, je n'ai plus accès à %MESSAGE% dans mon dernier bloc IF imbriqué! Ça fait du charabia par la suite.

    Est-ce que quelqu'un vois une solution?

    voici mon 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    set MESSAGE=AAAAAH! PAS DE BON SENS, ALLERGIES AUX BOGUES
    IF %MESSAGE:~0,5% == AAAAA (
    
    ECHO ÇA CRAINT!
    
    )ELSE (
         IF %MESSAGE:~17,3% == ALL (
              FOR /F "tokens=1* delims= " %%A in ("%MESSAGE%") DO (
                   echo ÇA SCHLINGUE!
              )
         )ELSE (
              IF %MESSAGE:~35,3% == AUR (
                   FOR /F "tokens=1,2,3* delims= " %%C in ("%MESSAGE%") DO (
                        ECHO ÇA ME FOU LA POISSE
                   )
              )ELSE (
                   IF %MESSAGE:~0,6% == DEVELO (
                        FOR /F "tokens=* delims= " %%H in ("%MESSAGE%") DO (
                             ECHO COUCOU
                        )
                   )ELSE (
                        IF %MESSAGE:~0,4% == MAIS (
                             FOR /F "tokens=* delims= " %%H in ("%MESSAGE%") DO (
                                   ECHO BIDON
                             )
                        )ELSE (
    set COCO=BIENVENUE DANS LE TRIANGLE DES BERMUDES!!!
    set CACA=ICI SE TROUVE UN MYSTÈRE DANS UNE CHARADE
    ECHO %MESSAGE%
    echo %COCO%
    echo %CACA%  
    REM JE N'AI PLUS ACCES A LA VARIABLE %MESSAGE% ! EN PLUS CES DEUX VARIABLES SONT NULLES POURTANT NOUS VENONS DE LES AFFECTER...
    pause
                             IF /I "%COCO%"==BIENVENUE DANS LE TRIANGLE DES BERMUDES!!! (
    rem CE BLOC IF FAIT PLANTER LE PROGRAMME AVEC UN CAS DU 1er BLOC
    
    
                                    FOR /F "tokens=* delims= " %%H in ("%MESSAGE%") DO (
    
                                       echo WELCOME TO MY WORLD %%H
                             )
                        )
                   )
              )
         )
    )

  2. #2
    Membre chevronné

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Billets dans le blog
    1
    Par défaut
    Si tu commençais par reduire ton code à l'expression la plus simple ça serait plus facile pour t'aider. Comme ça, il y a 18 messages dans tous les sens, et 36 boucles imbriquées, ca ne donne pas envie d'y perdre du temps. Essaie par recherche dichotomique de t'approcher au plus prés du problème

  3. #3
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Oh là on sort les grands termes scientifiques!

    En fait il ne s'agit pas d'un seul problème, mais plusieurs problèmes qui s'évaluent au cas par cas.

    Enfin, j'ai remplacé la boucle FOR du IF imbriqué qui contenait d'autres IF imbriqués en appellant (CALL :FONCTION) une fonction et en lui passant tous les paramètres nécessaires!

    Ça devrait aider, car chaque élément (BLOC) fonctionne et tant que tel si je les tests individuellement.

    Merci pour ta réponse!

  4. #4
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Malheureusement, même en essayant de détourner le problème. Il se reproduit: «( était innatendu»

  5. #5
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    ARGGH! C'est vraiment frustrant ce truc!

    Est-ce quelqu'un a une piste?

    je suis rendu avec le message: "de était inattendu."
    DE étant le deuxième token de %MESSAGE% délimité par des espaces.

    J'ai retiré mes if imbriqué.

    Pourtant si j'enlève toutes mes CHECK de MESSAGE le traitement passe :S

  6. #6
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Je veux bien regarder ton "script" de plus près, à condition que tu fasses l'effort de supprimer les déviances et vulgarités qu'il contient.

  7. #7
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Parfait,

    Je refais un sample code:

    fais toi un fichier in.txt avec ça dedans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    2099-11-11 11:11:1 **** BONJOUR **** TIGER de la BBB AAAA_A_AAAAA_AAAAA, du livre AAAA_A_AAAAA_AAA, !  
    
    2099-11-11 2:1:52 **** BONSOIR **** AAAA_A_AAAAA_AAAAA____AAAA_A_AAAAA_AAAAA__9___1234567890
    parfait alors ensuite un .BAT:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    FOR /F "tokens=1,2,4,5* delims= " %%a in (in.txt) DO (
           CALL :A1 %%a %%b %%c "%%e"
    )
    
    exit /B
    :A1
    echo ici A1
    SET MESSAGE=%4
    
    rem enlever les guillemets
    SET MESSAGE=%MESSAGE:~1,-1%
    
    echo %MESSAGE% a traiter plus bas
    
    IF %MESSAGE:~0,14% == AAA_CCCCC_DDDD (
          FOR /F "tokens=* delims= " %%H in ("%MESSAGE%") DO (
              CALL :B1 "%%H"
          )
    )ELSE (
         IF %MESSAGE:~0,5% == TIGER (
             FOR /F "tokens=1,5,8 delims= " %%t in ("%MESSAGE%") DO (
                 CALL :C1 %%v %%u %%t %MESSAGE%
             )
         )
    )
    
    EXIT /B
    
    :B1
    echo ici B1
    
    exit /B
    
    :C1
    echo ici C1 on lit: %1 %2 %3 %4 
    
    exit /B
    Super! Çä réplique parfaitement mon problème: "de était inattendu" !

    «de» Étant le token #2 de %message%. Je n'ai aucune idée pourquoi il sort ça.


  8. #8
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Problème de guillemets (entre autres).

    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
    34
    35
    36
    37
    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    FOR /F "tokens=1,2,4,5* delims= " %%a in (in.txt) DO (
           CALL :A1 %%a %%b %%c "%%e"
    )
    
    exit /B
    :A1
    echo ici A1
    SET MESSAGE=%~4
    echo "%MESSAGE%" a traiter plus bas
    
    IF "%MESSAGE:~0,14%" == "AAA_CCCCC_DDDD" (
          FOR /F "tokens=* delims= " %%H in ("%MESSAGE%") DO (
              CALL :B1 "%%H"
          )
    )ELSE (
         IF "%MESSAGE:~0,5%" == "TIGER" (
             FOR /F "tokens=1,5,8 delims= " %%t in ("%MESSAGE%") DO (
                 CALL :C1 %%v %%u %%t %MESSAGE%
             )
         )
    )
    
    EXIT /B
    
    :B1
    echo ici B1
    
    exit /B
    
    :C1
    echo ici C1 on lit: %1 %2 %3 %4 
    
    exit /B

  9. #9
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    ..

  10. #10
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Bonjour,

    J'ai un nouveau probème.

    Avec le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                                       FOR /F "tokens=1,2,3,4,5,6,7,8,9,10* delims=_" %%i in ("%MESSAGE%") DO (
                                             CALL :ETAPE011 %%i %%j %%k %%l
                           ECHO  SSSS %CHAINE%
    rem                                         CALL :ETAPE012 %%m %%n %%o %%p %%q %%r %%s
    
    exit /B
                                       )
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    :ETAPE011
    SET ETAPE=ETAPE011
    
    SET CHAINE=%1_%2_%3_%4
    ECHO %CHAINE% RRR
    
    PAUSE
    EXIT /B
    À mon écho avant d'appeler ETAPE012, %CHAINE% EST = NUL.

    quelqu'un a une idée?

  11. #11
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Si tu as utilisé

    setlocal enabledelayedexpansion

    La lecture de la variable "chaine" dans le corps de "for" se fait avec l'écriture !chaine! au lieu de %chaine%

  12. #12
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Tout pour nous simplifier la vie finalement

    J'ai réussi à détourner le problème en appellant la variable dans une fonction.

    J'avais déjà eu à utiliser le !var!, mais je ne comprenais pas vraiment pourquoi.

    Merci des éclaircissements et bonne journée!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/09/2014, 11h07
  2. text, ntext et image sont interdits dans les variables locales
    Par Sebounet19 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/07/2013, 15h44
  3. Réponses: 2
    Dernier message: 31/05/2013, 12h48
  4. Réponses: 9
    Dernier message: 18/06/2010, 11h26
  5. Réponses: 2
    Dernier message: 14/10/2005, 10h11

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