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 :

Boucle FOR - 26 jetons au maximum ? [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut Boucle FOR - 26 jetons au maximum ?
    Bonjour à tous,

    petite question assez simple mais j'aimerais avoir une confirmation de mon mauvais pressentiment.

    Lorsque dans une boucle FOR on découpe une ligne en jetons, est-on limité à 26 jetons (26 lettres dans l'alphabet) ?

    Si ce n'est pas le cas, comment fait-on pour référencer le 27ème jeton ?

    Petit exemple pour illustrer mes propos. Si j'exécute le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR /F "tokens=1,2 delims=-" %%Z IN ("CAMP-SCR") DO (
    	ECHO %%Z %%A
    )
    j'obtiens ceci comme sortie dans la console:

    D'avance, merci pour vos lumières.

    Bien à vous,

    Brolon

  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
    De mon point de vue c'est exact. Si tu veux plus, tu peux imbriquer 2 boucles entre elle ou passer par awk.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    : for /?
    Exécute une commande donnée pour chaque fichier d'un ensemble de fichiers.
    
    FOR %variable IN (ensemble) DO commande [paramètres]
    
      %variable   Spécifie un paramètre remplaçable par une seule lettre.
      (ensemble)  Ensemble de fichiers. Caractères génériques autorisés.
      commande    Commande à exécuter pour chaque fichier.
      paramètres  Liste des paramètres ou des options pour la commande
                  spécifiée.
    
    Pour utiliser la commande FOR dans un programme de commandes, spécifiez
    %%variable au lieu de %variable. Les noms de variables respectent la
    casse, donc %i est différent de %I.
    
    Si les extensions de commandes sont activées, les formes supplémentaires
    suivantes sont prises en charge pour la commande FOR*:
    
    FOR /D %variable IN (ensemble) DO commande [paramètres]
    
        Si ensemble contient des caractères génériques, alors la correspondance se
        fait sur les noms de répertoires au lieu des noms de fichiers.
    
    FOR /R [[lecteur:]chemin] %variable IN (ensemble) DO commande [paramètres]
    
        Parcourt l'arborescence de répertoires depuis la racine [lecteur:]chemin,
        en exécutant FOR dans chaque répertoire de l'arborescence. Si aucun
        répertoire n'est spécifié après /R alors le répertoire en cours est
        utilisé. Si ensemble est seulement un point (.) alors seule l'arborescence
        de répertoires sera énumérée.
    
    FOR /L %variable IN (début,pas,fin) DO commande [paramètres]
    
        L'ensemble est une séquence de chiffres allant de début à fin, incrémenté
        de pas. Ainsi (1,1,5) génère la séquence 1 2 3 4 5 et (5,-1,1) génère la
        séquence (5 4 3 2 1)
    
    FOR /F ["options"] %variable IN (ensemble-fichiers) DO commande [paramètres]
    FOR /F ["options"] %variable IN ("chaîne") DO commande [paramètres]
    FOR /F ["options"] %variable IN ('commande') DO commande [paramètres]
    
        ou, si l'options usebackq est utilisée*:
    
    FOR /F ["options"] %variable IN (ensemble-fichiers) DO commande [paramètres]
    FOR /F ["options"] %variable IN ('chaîne') DO commande [paramètres]
    FOR /F ["options"] %variable IN (`commande`) DO commande [paramètres]
    
        ensemble-fichiers est un ou plusieurs noms de fichiers. Chaque fichier est
        ouvert, lu et traité avant de passer au fichier suivant de
        ensemble-fichiers. Le traitement consiste à lire dans le fichier, le
        découper en lignes individuelles de texte puis analyser chaque ligne en
        zéro ou plusieurs parties. Le corps de la boucle FOR est ensuite appelé
        avec la ou les valeurs de variables prenant la valeur de la ou des parties
        trouvées. Par défaut, /F transmet la première partie séparée par un blanc
        dans chaque ligne de chaque fichier. Les lignes vides sont ignorées. Vous
        pouvez outrepasser le comportement d'analyse par défaut en spécifiant le
        paramètre optionnel "options". Ceci est une chaîne entre guillemets
        contenant un ou plusieurs mots-clés spécifiant diverses options d'analyse.
        Les mots-clés sont*:
    
            eol=c           - spécifie un caractère de commentaire de fin de ligne
                              (un seul)
            skip=n          - spécifie le nombre de lignes à ignorer en début
                              de fichier.
            delims=xxx      - spécifie un ensemble de délimiteurs. Ceci remplace
                              l'ensemble de délimiteurs par défaut qui sont
                              l'espace et la tabulation.
            tokens=x,y,m-n  - spécifie les parties de chaque ligne devant être
                              transmises au corps de FOR à chaque itération.
                              Ceci provoquera l'allocation de noms de variables
                              supplémentaires. La forme m-n est une étendue
                              spécifiant les parties allant de m à n. Si le
                              dernier caractère de la chaîne tokens= est une
                              astérisque, alors une variable supplémentaire est
                              allouée et reçoit le texte restant dans la ligne
                              suivant la dernière partie analysée.
            usebackq        - spécifie que la nouvelle sémantique est en place,
                              lorsqu'une chaîne entre guillemets inversés est
                              exécutée en tant que commande et une chaîne entre
                              guillemets simples est une chaîne de commande
                              littérale et permet l'utilisation de guillemets
                              doubles pour citer des noms de fichiers.
    
        Quelques exemples explicatifs*:
    
    FOR /F "eol=; tokens=2,3* delims=, " %i in (monfich.txt) do @echo %i %j %k
    
        analyse chaque ligne de monfich.txt, en ignorant les lignes commençant
        par un point-virgule, en transmettant les 2nde et 3ème parties de
        chaque ligne au corps de FOR, les parties étant délimitées par des
        virgules et/ou espaces. Notez que le corps de FOR référence %i pour
        l'obtention de la 2nde partie, %j pour l'obtention de la 3ème partie
        et %k pour l'obtention des parties restantes après la 3ème. Pour les
        noms de fichiers contenant des espaces, placez les noms de fichiers
        entre guillemets doubles. Afin d'utiliser ainsi les guillemets doubles,
        vous devez également utiliser l'option usebackq, faute de quoi les
        guillemets doubles seraient interprétés comme définissant une chaîne
        littérale à analyser.
    
        %i est déclarée explicitement dans la déclaration FOR et %j et %k
        sont déclarées implicitement via l'option tokens=. Vous pouvez spécifier
        jusqu'à 26 paries via la ligne tokens=, tant que cela ne provoque pas
        de tentative de déclaration de variable plus élevée que la lettre 'z'
        ou 'Z'. Souvenez-vous que les variables de FOR se composent de lettres,
        tiennent compte de la casse, sont globales et que  plus de 52 ne peuvent
        pas être actives à la fois.
    
        Vous pouvez aussi utiliser la logique d'analyse FOR /F sur une chaîne en
        plaçant ensemble-fichiers entre guillemets entre les parenthèses,
        en utilisant des guillemets simples. Elle sera traitée comme une ligne
        d'entrée simple provenant d'un fichier puis analysée.
    
        Enfin, vous pouvez utiliser la commande FOR /F pour analyser les
        données en sortie d'une commande. Faites ceci en plaçant des guillemets
        inversés autour de ensemble-fichiers entre les parenthèses.  Elle sera
        traitée comme une ligne de commande transmise à un CMD.EXE enfant et
        la sortie est gardée en mémoire et analysée comme s'il s'agissait d'un
        fichier. Ainsi l'exemple suivant*:
    
          FOR /F "usebackq delims==" %i IN (`ensemble`) DO @echo %i
    
        énumérerait les noms de variables d'environnement de l'environnement
        en cours.
    
    De plus, la substitution de références de variables FOR a été améliorée.
    Vous pouvez maintenant utiliser la syntaxe optionnelle suivante*:
    
        %~I         - étend %I en supprimant les guillemets (")
        %~fI        - étend %I en nom de chemin d'accès reconnu
        %~dI        - étend %I en lettre de lecteur uniquement
        %~pI        - étend %I en chemin d'accès uniquement
        %~nI        - étend %I en nom de fichier uniquement
        %~xI        - étend %I en extension de fichier uniquement
        %~sI        - chemin étendu contenant uniquement des noms courts
        %~aI        - étend %I en attributs du fichier
        %~tI        - étend %I en date/heure du fichier
        %~zI        - étend %I en taille du fichier
        %~$PATH:I   - parcourt les répertoires de la variable
                       d'environnement PATH et étend %I en nom du
                       premier fichier reconnu trouvé. Si le nom de la
                       variable d'environnement n'est pas défini ou
                       que le fichier n'est pas trouvé par la recherche,
                       alors ce modificateur étend en chaîne vide
    
    Vous pouvez combiner les modificateurs pour obtenir des résultats composés*:
    
        %~dpI       - étend %I en lettre de lecteur et chemin d'accès uniquement
        %~nxI       - étend %I en nom de fichier et extension uniquement
        %~fsI       - étend %I en nom de chemin complet avec noms courts
                       uniquement
        %~dp$PATH:i - parcourt les répertoires listés dans la variable
                       d'environnement PATH à la recherche de %I et étend
                       en lettre de lecteur du premier trouvé.
        %~ftzaI     - étend %I en DIR comme ligne en sortie
    
    Dans les exemples ci-dessus %I et PATH peuvent être remplacés par d'autres
    valeurs valides. La syntaxe %~ se termine par un nom de variable FOR valide.
    Le choix de noms de variables en majuscules comme %I facilite la lecture
    et empêche toute confusion avec les modificateurs qui ne tiennent pas compte
    de la casse.

  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
    Citation Envoyé par brolon Voir le message
    Bonjour à tous,

    petite question assez simple mais j'aimerais avoir une confirmation de mon mauvais pressentiment.

    Lorsque dans une boucle FOR on découpe une ligne en jetons, est-on limité à 26 jetons (26 lettres dans l'alphabet) ?

    Si ce n'est pas le cas, comment fait-on pour référencer le 27ème jeton ?

    Petit exemple pour illustrer mes propos. Si j'exécute le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR /F "tokens=1,2 delims=-" %%Z IN ("CAMP-SCR") DO (
    	ECHO %%Z %%A
    )
    j'obtiens ceci comme sortie dans la console:



    Brolon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FOR /F "tokens=1,2 delims=-" %%Z IN ("CAMP-SCR") DO (
    	ECHO %%Z %%[
    )

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Haa visiblement l'indexation suit le code ASCII : ) Mais malgré tout cela reste limité par le fait que certains caractères ne sont pas utilisable après le %% (comme '^' par exemple) ?

    Avez-vous l'habitude de traiter plus de 26 jetons ? Si oui, quelle est votre méthode?

    D'avance merci.

  5. #5
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for /f "tokens=1,2,3,4,5,6,7,8,9,10,11 delims=-" %Z in (
    "aaa-bbb-ccc-ddd-eee-fff-ggg-hhh-iii-jjj-kkkk"
    ) do echo %Z %[ %\ %] %^^ %_ %` %a %b
    I'm_HERE

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Joli : )

  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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par brolon Voir le message
    Joli : )
    +1
    Un peu ésotérique tout de même

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Juste pour info, comme je dois potentiellement traiter plus de 100 jetons, je vais opter pour une autre approche (que je n'avais encore jamais tentée en DOS) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET STR=CAMP-SCR-BROL-TRUC-MACHIN-A-B-C
    :LOOP
    FOR /F "tokens=1* delims=-" %%A IN ("%STR%") DO (
    	ECHO !CPT! %%A
    	SET STR=%%B
    	SET /A CPT=!CPT!+1
            GOTO LOOP
    )
    Ainsi, dans ma boucle je peux faire toutes les comparaisons nécessaires (153ème token = "ABC" par exemple).

    La terminaison de la boucle est assurée par le fait que la variable %STR% diminue à chaque itération.

    Il existe peut-être des façons plus propres de faire cela. Si vous en connaissez, je suis preneur ; )

  9. #9
    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
    Un goto qui casse un for, ca me fait un peu peur...

  10. #10
    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
    Citation Envoyé par brolon Voir le message
    Juste pour info, comme je dois potentiellement traiter plus de 100 jetons, je vais opter pour une autre approche (que je n'avais encore jamais tentée en DOS) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET STR=CAMP-SCR-BROL-TRUC-MACHIN-A-B-C
    :LOOP
    FOR /F "tokens=1* delims=-" %%A IN ("%STR%") DO (
    	ECHO !CPT! %%A
    	SET STR=%%B
    	SET /A CPT=!CPT!+1
            GOTO LOOP
    )
    Ainsi, dans ma boucle je peux faire toutes les comparaisons nécessaires (153ème token = "ABC" par exemple).

    La terminaison de la boucle est assurée par le fait que la variable %STR% diminue à chaque itération.

    Il existe peut-être des façons plus propres de faire cela. Si vous en connaissez, je suis preneur ; )
    Salut,

    tu peux spliter ta variable puis traiter chaque jeton à part:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET STR=CAMP-SCR-BROL-TRUC-MACHIN-A-B-C
    
    for %%a IN ("%STR:-=" "%") do echo %%~a

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Citation Envoyé par john.fender Voir le message
    Un goto qui casse un for, ca me fait un peu peur...
    C'est aussi un peu ma crainte ...

    J'ai fait quelques tests, cela fonctionne. Mais je ne sais pas ce qu'il se passe là derrière (en mémoire).

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    Salut,

    tu peux spliter ta variable puis traiter chaque jeton à part:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET STR=CAMP-SCR-BROL-TRUC-MACHIN-A-B-C
    
    for %%a IN ("%STR:-=" "%") do echo %%~a
    J'aime bien cette approche, plus propre que la mienne !

  13. #13
    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
    If et goto fonctionne trés trés mal ensemble dans certain cas, je l'ai constaté. J'ai peur que ce puisse être la même chose avec for. De manière général, batch est faible sur ce genre de chose, tu devrais peut être passer par VBS et du sur mesure. As tu regardé ce que fait AWK aussi ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Par défaut
    Ce n'est pas la première fois qu'on me parle d'awk. Il est donc grand temps que je m'y intéresse.

    [ Si cela satisfait mes besoins, j'espère que je pourrai l'installer au boulot ... pas garanti ]

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

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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