Boucle for dans un batch

Résolu
Bonjour,

Voila je suis en train de faire un batch et un problème se pose.
Pour automatiser une tache j'ai voulut faire une boucle for :

set /A nbrcharmax=16
set /A nbrcharmin=1
set /A chiffre=1
for /L %i in (1,1,30) do (
if %chiffre% LEQ %nbrcharmin% set char%chiffre%=1
if not %chiffre% LEQ %nbrcharmin% char%chiffre%=0
if %chiffre% GTR %nbrcharmax% set char%chiffre%=2
echo char%chiffre%
set /A chiffre=chiffre+1
)


J'ai écrit les valeurs nbrcharmax et nbrcharmin par défaut normalement c'est l'utilisateur qui les définit et il y a tout un tas de comparaison pour vérifier que ce sont des chiffres et qu'ils sont comprit dans un intervalle définit auparavant et de sorte que nbrcharmin soit toujours strictement plus petit que nbrcharmax.

En claire je voudrait savoir si il est possible de faire une boucle qui donne les mêmes résultats que celle du dessus, mais qui marche ^^

En claire que cela définisse les valeurs de

char1, char2, ..., char30 en fonction des valeur rentrer par l'utilisateur que sont nbrcharmax et nbrcharmin.

Merci pour votre aide futur.

PS: je ne suis pas habituer au boucle for dans un batch je n'ai pratiquement fait que des bash linux alors ...
--
"La capacité d'apprendre est un don ; La faculté d'apprendre est un talent ; La volonté d'apprendre est un choix."

15 réponses

  1. Bonsoir,

    Je découvre probablement en même temps que toi cette façon de faire car avant que je ne ponde ce qui suit j'ignorais qu'il fut possible de définir, on va dire "de manière dynamique" des variables distinctes, en l'occurrence char1, char2,.........char30.

    SETLOCAL ENABLEdelayedExpansion
     SETLOCAL ENABLEextensions
     CLS
     echo off
    
        set /A nbrcharmax=16
        set /A nbrcharmin=1
        set /A chiffre=1
    
        for /L      %%i      in (1,1,30)                 do (
            set "char=char%%i"
            if !chiffre! LEQ %nbrcharmin% (set /A !char! = 1)
            if !chiffre! GTR %nbrcharmin% (set /A !char! = 0)
            if !chiffre! GTR %nbrcharmax% (set /A !char! = 2)
    rem echo Pour controles visuels:  !char! = !char%%i!
    rem  set /A chiffre  = !chiffre! + 1                 )
    
        for /L      %%j     in (1,1,30)                  do (
           set "char=char%%j"
           if %%j       ==  1 (echo Pour controles visuels: )
           echo !char! contient la valeur: !char%%j!        )
    
     ................... suite du programme


    Résultats:
    Pour controles visuels:
    char1 contient la valeur: 1
    char2 contient la valeur: 0
    char3 contient la valeur: 0
    char4 contient la valeur: 0
    char5 contient la valeur: 0
    char6 contient la valeur: 0
    char7 contient la valeur: 0
    char8 contient la valeur: 0
    char9 contient la valeur: 0
    char10 contient la valeur: 0
    char11 contient la valeur: 0
    char12 contient la valeur: 0
    char13 contient la valeur: 0
    char14 contient la valeur: 0
    char15 contient la valeur: 0
    char16 contient la valeur: 0
    char17 contient la valeur: 2
    char18 contient la valeur: 2
    char19 contient la valeur: 2
    char20 contient la valeur: 2
    char21 contient la valeur: 2
    char22 contient la valeur: 2
    char23 contient la valeur: 2
    char24 contient la valeur: 2
    char25 contient la valeur: 2
    char26 contient la valeur: 2
    char27 contient la valeur: 2
    char28 contient la valeur: 2
    char29 contient la valeur: 2
    char30 contient la valeur: 2

    En espérant que cela réponde à ton attente,
    1. Merci beaucoup c'est tout a fait se que je voulait ^^ mais peut m'expliquer la suite du programme (soit la deuxième boucle for) je ne comprend pas a quoi elle sert.

      En tout cas merci pour ta réponse rapide
      1. Juste comme sa la boucle ne marche pas tout comme celle que j'avais essayer de faire elle ne reconnait pas la suite après do (

        Voila c'est tout
        1. Oups !

          rem set /A chiffre = !chiffre! + 1 )

          J'ai mis cette ligne en commentaire au dernier moment et je n'ai pas remarqué la parenthèse fermante qui par le fait a "sauté". Il te suffit d'ajouter une ligne avec une parenthèse fermante :
          )
      2. Bonjour,

        for /L %%j in (1,1,30) do (
        set "char=char%%j"
        if %%j == 1 (echo Pour controles visuels: )
        echo !char! contient la valeur: !char%%j! )

        Cette seconde boucle for affiche (echo) le contenu des 30 variables. Elle permet uniquement de s'assurer qu'il existe bien 30 variables de noms différents convenablement renseignées avec une valeur cohérente (0, 1 ou 2). Cette séquence d'ordres devra, bien entendu, être éliminée une fois les tests achevés, je l'ai laissée pour te permettre de vérifier les résultats:
        char1 contient la valeur: 1
        char2 contient la valeur: 0
        char3 contient la valeur: 0
        ....... ........... .. .......... .
        ....... ........... .. .......... .

        La ligne ci-dessous (en commentaire dans la 1ère boucle for), si elle était activée, aurait le même effet que celle de la seconde boucle for à cela près qu'elle ne permettrait pas de vérifier l'existence des 30 variables puisqu'elle affiche (echo) chaque variable au moment où elle est définie (set "char=char%%i"). A ce stade du déroulement du programme, rien n'indique que les variables charn (n < %%i) existent effectivement.
        rem echo Pour controles visuels: !char! = !char%%i!
        1. En fait j'ai fait autrement pour ma boucle voila :

          set /A nbrcharmax=16
          set /A nbrcharmin=1
          set /A chiffre=1
          
          for /L %%i in (1,1,30) do (
          set charactere=char%chiffre%
          if %chiffre% LEQ %nbrcharmin% set /A valchar=1
          if %chiffre% GTR %nbrcharmin% set /A valchar=0
          if %chiffre% GTR %nbrcharmax% set valchar=n
          echo %charactere% vaut %valchar%
          echo set %charactere%=%valchar%>>toto.txt
          echo %chiffre%
          set /A chiffre=%chiffre%+1
          )
          pause
          


          Le problème est que l'incrémentation de la variable %chiffre% ne fonctionne pas si tu avait une idée.
          1. C'est le problème classique lié à l'expansion retardée de variables. Tape sous l'invite de commandes help set, positionne toi et prends connaissance de la seconde page d'explication affichée à l'écran en t'aidant de mon code, tu devrais comprendre ce qui se passe. Dans le cas contraire pose des questions.
            1. Voila j'ai suivit t'est conseil et j'ai modifier ma boucle : maintenant l'incrémentation fonctionne comme il faut mais les variable !charactere! et !valchar! n'affiche pas les valeur que je leur est donne pourrait tu m'expliquer cela Merci.

              Voila une fois modifier.

              set /A nbrcharmax=16
              set /A nbrcharmin=1
              
              for /L %%i in (1,1,30) do (
              set "charactere=char%%i"
              if %%i LEQ %nbrcharmin% set /A !valchar! = 1
              if %%i GTR %nbrcharmin% set /A !valchar! = 0
              if %%i GTR %nbrcharmax% set !valchar! = n
              echo !charactere! vaut !valchar!
              echo set !charactere!=!valchar!>>toto.txt
              echo %%i
              )
              
              1. Bonjour,

                En réponse à ta question, voici, sous forme de correction, quelques explications.

                SETLOCAL ENABLEdelayedExpansion
                 SETLOCAL ENABLEextensions
                 CLS
                 echo off
                
                 set /A nbrcharmax=16
                set /A nbrcharmin=1
                
                for /L %%i in (1,1,30) do (
                
                REM Ici il faut renseigner la variable valchar avec son propre nom suffixé par
                REM    une valeur allant de 1 à 30.
                REM set "charactere=char%%i"
                SET "valchar=valchar%%i"
                REM POur s'en persuader faire :
                ECHO  !valchar!
                REM echo  !charactere!
                REM Jusque là c'est cohérent avec la variable charactere
                pause
                
                
                REM Ici on test et on initialise LE CONTENU de valchar. Ce contenu  
                REM   (ce'est-à-dire !valchar!), on vient de le voir, est le nom de la
                REM    variable (varchar1, varchar2, .........., 
                REM    varchar30 ) suffixé avec  une valeur. 
                REM    Ce qui revient à dire qu'une variable ayant pour nom varcharn(n = 1 à 30)
                REM    est créée et renseignée avec une valeur (0, 1 ou 2) à chaque itération.
                REM    Tu aurais dû continuer avec la variable charactere où bien comme je l'ai
                REM    fait plus haut ne pas définir charactere mais plutôt varchar. Car à ce
                REM    niveau, comme tu as fait avec la variable charactere, varchar ne contient
                REM    rien de cohérent en tout cas pas ce à quoi on s'attend (c'est-à-dire son 
                REM    propre nom suffixé par une valeur allant de 1 à 30).
                if %%i LEQ %nbrcharmin% set /A !valchar! = 1
                if %%i GTR %nbrcharmin% set /A !valchar! = 0
                
                REM Ici  Je n'ai pas compris, pourquoi n ?
                REM if %%i GTR %nbrcharmax% set !valchar! = n
                IF %%i GTR %nbrcharmax% set /A !valchar! = 2
                
                REM Ici c'est la conséquence de ce qui précède plus l'oubli du suffixe n qui
                REM    référence (nomme) la variable en cours :
                REM echo !charactere! vaut !valchar!
                REM     Il faut si on conserve varchar procéder comme cela :
                ECHO !valchar! vaut !valchar%%i!
                
                REM Ici  Idem
                REM echo set !charactere!=!valchar!>>toto.txt
                rem ECHO !valchar!=!valchar%%i!>>toto.txt
                echo %%i
                )
                1. Je ne comprend pas pourquoi tu rajoute rem devant certaine ligne de code qui ne sont pas des remarque ? est ce que cela a une influence sur le reste du code en tout cas merci.

                  Voila j'ai fait quelque modifie après avoir lu ton code et je tombe sur sa :

                  SETLOCAL ENABLEdelayedExpansion
                  SETLOCAL ENABLEextensions
                  
                  set /A nbrcharmax=16
                  set /A nbrcharmin=1
                  
                  for /L %%i in (1,1,30) do (
                  set "charactere=char%%i"
                  set "valchar=valchar"
                  if %%i LEQ %nbrcharmin% set /A !valchar!=1
                  if %%i GTR %nbrcharmin% set /A !valchar!=0
                  if %%i GTR %nbrcharmax% set !valchar!=n
                  echo !charactere! vaut !valchar!
                  echo set !charactere!=!valchar!>>toto.txt
                  echo %%i>>toto.txt
                  )
                  


                  le résultat finale dans le fichier toto me plait sauf que pour n il met toujours 0 et pas n voila le problème
                  Dsl si je ne copie pas tout entier ton code mais c'est comme sa que j'apprends ^^.

                  Pour le n c'est qu'après lorsque que se sera finit je ferait une incrémentation de tout les chiffre un part un et si je met comme valeur ne devant pas être incrémenter 2 ^^ sa va pas aller alors que le je dit que si charX vaut n on s'arrête.
                  1. Hormis cette ligne :
                    rem ECHO !valchar!=!valchar%%i!>>toto.txt
                    que j'ai mis en commentaire pour faciliter les tests, les autres sont corrigées par une nouvelle ligne qui annule et remplace celle mise en commentaire (précédée par REM).

                    Tu as rencontré des problèmes lors des tests ?
                    1. Le seul problème est que le n ne remplace pas le 0 si %%i plus grand que %nbrcharmax% sinon tout marche super bien.

                      En tout cas merci pour ton aide

                      PS : si depuis le début tu a remarquer la faute avec charactere c'est en faite que je me suis rendu compte de la faute une fois que tout était finit ^^
                      1. En claire que cela définisse les valeurs de
                        char1, char2, ..., char30 en fonction des valeur rentrer par l'utilisateur que sont nbrcharmax et nbrcharmin


                        Je te signale, mais c'est peut-être ce que tu souhaites maintenant, que ton code ne préserve pas cette fonctionnalité. Les variables char1, char2, ..., char30 (représentées par valchar dans ton code) sont maintenant vides.

                        --Cordialement.
                        Cchristian.
                        1. Je suis désole mais je ne comprend pas ce que tu viens de me dire mais le principale marche alors merci.

                          Le seul problème pour moi c'est que la valeur "n" ne peut pas se mettre sur le variable !valchar!
                          En tout cas merci pour ton aide (et ta patience faut bien le dire ^^).

                          En fait si tu pouvait voir sa si tu connait ^^ :

                          https://forums.commentcamarche.net/forum/affich-13769810-puissance-d-un-nombre-dans-un-batch#dernier

                          Voila pourquoi je le voulait bien que non finit ^^
                          @echo off
                          
                          rem initialisation setlocal
                          SETLOCAL ENABLEdelayedExpansion
                          SETLOCAL ENABLEextensions
                          
                          rem definition du titre
                          title Gencode
                          
                          rem mode d'affichage
                          mode 75,50
                          
                          rem definition des couleurs
                          color 5b
                          
                          REM debut
                          echo.
                          echo         ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
                          echo         º   Bienvenue   º
                          echo         ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
                          echo.
                          
                          REM Initialisation des valeurs des variables demande au public
                          set nbrcharmin=16
                          set nbrcharmax=0
                          
                          :def1
                          set /P nbrcharmin=Definissez le nombre de caractere minimale (entre 1 et 15)
                          
                          :01
                          if %nbrcharmin%==1 (goto def2
                          ) else (goto 02
                          )
                          
                          :02
                          if %nbrcharmin%==2 (goto def2
                          ) else (goto 03
                          )
                          
                          :03
                          if %nbrcharmin%==3 (goto def2
                          ) else (goto 04
                          )
                          
                          :04
                          if %nbrcharmin%==4 (goto def2
                          ) else (goto 05
                          )
                          
                          :05
                          if %nbrcharmin%==5 (goto def2
                          ) else (goto 06
                          )
                          
                          :06
                          if %nbrcharmin%==6 (goto def2
                          ) else (goto 07
                          )
                          
                          :07
                          if %nbrcharmin%==7 (goto def2
                          ) else (goto 08
                          )
                          
                          :08
                          if %nbrcharmin%==8 (goto def2
                          ) else (goto 09
                          )
                          
                          :09
                          if %nbrcharmin%==9 (goto def2
                          ) else (goto 010
                          )
                          
                          :010
                          if %nbrcharmin%==10 (goto def2
                          ) else (goto 011
                          )
                          
                          :011
                          if %nbrcharmin%==11 (goto def2
                          ) else (goto 012
                          )
                          
                          :012
                          if %nbrcharmin%==12 (goto def2
                          ) else (goto 013
                          )
                          
                          :013
                          if %nbrcharmin%==13 (goto def2
                          ) else (goto 014
                          )
                          
                          :014
                          if %nbrcharmin%==14 (goto def2
                          ) else (goto 015
                          )
                          
                          :015
                          if %nbrcharmin%==15 (goto def2
                          ) else (goto def1
                          )
                          
                          :def2
                          set /A nbrcharminmax=nbrcharmin
                          set /A nbrcharminmax=nbrcharminmax+1
                          set /P nbrcharmax=Definissez le nombre de caractere maximale (entre %nbrcharminmax% et 30)
                          
                          :1
                          if %nbrcharmax%==1 (goto autre
                          ) else (goto 2
                          )
                          
                          :2
                          if %nbrcharmax%==2 (goto autre
                          ) else (goto 3
                          )
                          
                          :3
                          if %nbrcharmax%==3 (goto autre
                          ) else (goto 4
                          )
                          
                          :4
                          if %nbrcharmax%==4 (goto autre
                          ) else (goto 5
                          )
                          
                          :5
                          if %nbrcharmax%==5 (goto autre
                          ) else (goto 6
                          )
                          
                          :6
                          if %nbrcharmax%==6 (goto autre
                          ) else (goto 7
                          )
                          
                          :7
                          if %nbrcharmax%==7 (goto autre
                          ) else (goto 8
                          )
                          
                          :8
                          if %nbrcharmax%==8 (goto autre
                          ) else (goto 9
                          )
                          
                          :9
                          if %nbrcharmax%==9 (goto autre
                          ) else (goto 10
                          )
                          
                          :10
                          if %nbrcharmax%==10 (goto autre
                          ) else (goto 11
                          )
                          
                          :11
                          if %nbrcharmax%==11 (goto autre
                          ) else (goto 12
                          )
                          
                          :12
                          if %nbrcharmax%==12 (goto autre
                          ) else (goto 13
                          )
                          
                          :13
                          if %nbrcharmax%==13 (goto autre
                          ) else (goto 14
                          )
                          
                          :14
                          if %nbrcharmax%==14 (goto autre
                          ) else (goto 15
                          )
                          
                          :15
                          if %nbrcharmax%==15 (goto autre
                          ) else (goto 16
                          )
                          
                          :16
                          if %nbrcharmax%==16 (goto autre
                          ) else (goto 17
                          )
                          
                          :17
                          if %nbrcharmax%==17 (goto autre
                          ) else (goto 18
                          )
                          
                          :18
                          if %nbrcharmax%==18 (goto autre
                          ) else (goto 19
                          )
                          
                          :19
                          if %nbrcharmax%==19 (goto autre
                          ) else (goto 20
                          )
                          
                          :20
                          if %nbrcharmax%==20 (goto autre
                          ) else (goto 21
                          )
                          
                          :21
                          if %nbrcharmax%==21 (goto autre
                          ) else (goto 22
                          )
                          
                          :22
                          if %nbrcharmax%==22 (goto autre
                          ) else (goto 23
                          )
                          
                          :23
                          if %nbrcharmax%==23 (goto autre
                          ) else (goto 24
                          )
                          
                          :24
                          if %nbrcharmax%==24 (goto autre
                          ) else (goto 25
                          )
                          
                          :25
                          if %nbrcharmax%==25 (goto autre
                          ) else (goto 26
                          )
                          
                          :26
                          if %nbrcharmax%==26 (goto autre
                          ) else (goto 27
                          )
                          
                          :27
                          if %nbrcharmax%==27 (goto autre
                          ) else (goto 28
                          )
                          
                          :28
                          if %nbrcharmax%==28 (goto autre
                          ) else (goto 29
                          )
                          
                          :29
                          if %nbrcharmax%==29 (goto autre
                          ) else (goto 30
                          )
                          
                          :30
                          if %nbrcharmax%==30 (goto autre
                          ) else (goto def2
                          )
                          
                          :autre
                          if %nbrcharmax% LEQ %nbrcharmin% (goto def2
                          ) else (goto suite
                          )
                          
                          :suite
                          rem Ecriture du resultat
                          echo.
                          if %nbrcharmin%==1 (echo Le script va marquer dans un fichier texte toute les combinaison de nombres chiffre et caracteres speciaux entre %nbrcharmin% caractere et %nbrcharmax% characteres
                          ) else (echo Le script va marquer dans un fichier texte toute les combinaison de nombres chiffre et caracteres speciaux entre %nbrcharmin% caracteres et %nbrcharmax% characteres
                          )
                          echo.
                          
                          rem calcule du poids totale du fichier final
                          set /A poidsintermediaire=76^%nbrcharmax%-76^%nbrcharmin%
                          set /A poidsinter=%nbrcharmax%+15
                          set /A poidstotale=%poidsintermediaire%*%poidsinter%
                          set /A poidsko=%poidstotale%/1024
                          set /A poidsmo=%poidsko%/1024
                          set /A poidsgo=%poidsmo%/1024
                          
                          rem affichage du poids
                          echo le fichier texte final peserat aproximativement %poidstotale% octets %poidsko% Ko, ou encore %poidsmo% Mo et enfin %poidsgo% Go.
                          echo.
                          
                          rem initialisation setlocal dans gencode
                          echo @echo off>"gencode-%nbrcharmin%-%nbrcharmax%.bat"
                          echo SETLOCAL ENABLEdelayedExpansion>>"gencode-%nbrcharmin%-%nbrcharmax%.bat"
                          echo SETLOCAL ENABLEextensions>>"gencode-%nbrcharmin%-%nbrcharmax%.bat"
                          
                          rem boucle initialisation des charX
                          for /L %%i in (1,1,30) do (
                          set "charactere=char%%i"
                          set "valchar=valchar"
                          if %%i LEQ %nbrcharmin% set /A !valchar!=1
                          if %%i GTR %nbrcharmin% set /A !valchar!=0
                          if %%i GTR %nbrcharmax% set !valchar!=n
                          echo !charactere! vaut !valchar!
                          echo set !charactere!=!valchar!>>"gencode-%nbrcharmin%-%nbrcharmax%.bat"
                          )
                          
                          rem pause de verification
                          echo pause>>"gencode-%nbrcharmin%-%nbrcharmax%.bat"
                          
                          rem modification du mode
                          mode 110,33
                          
                          rem liste des touche possible
                          echo.
                          echo Vous pouvez choisir la priorit‚ avec laquel le script va s'executer.
                          echo.
                          echo A quoi cela va servir allez vous me dire ?
                          echo et bien cela joue sur la rapidit‚ avec laquel la solution va etre ‚crite.
                          echo.
                          echo appuyer sur les touche suivant pour definir le niveau de priorit‚.
                          echo N (pour Normal) lance le script avec la priorit‚ normal accorder … ce type de script (Choix par d‚faut automatiquement choisit au bout de 30 secondes)
                          echo.
                          echo B (pour BELOW NORMAL) lance le script avec une priorit‚ inferieur … la normale (lent)
                          echo.
                          echo H (pour HIGH) lance le script avec la priorit‚ la plus haute possible (le plus rapide)
                          echo.
                          echo A (pour ABOVE NORMAL) lance le script avec une priorit‚ superieur … la normale (relativement rapide)
                          echo.
                          echo L (pour LOW) lance le script avec la priorit‚ la plus basse possible (le plus lent mais economie de processus)
                          echo.
                          
                          rem commande choice
                          CHOICE /C:nbhal /N /T:n,30 "Choissisez la priorit‚ du programme"
                          If ERRORLEVEL==5 goto MARQUE5
                          If ERRORLEVEL==4 goto MARQUE4
                          If ERRORLEVEL==3 goto MARQUE3
                          If ERRORLEVEL==2 goto MARQUE2
                          If ERRORLEVEL==1 goto MARQUE1
                          
                          :MARQUE1
                          rem touche n
                          start gencode-%nbrcharmin%-%nbrcharmax%.bat
                          exit
                          rem fin du programme
                          
                          :MARQUE2
                          rem touche b
                          start /BELOWNORMAL gencode-%nbrcharmin%-%nbrcharmax%.bat
                          exit
                          rem fin du programme
                          
                          :MARQUE3
                          rem touche h
                          start /HIGH gencode-%nbrcharmin%-%nbrcharmax%.bat
                          exit
                          rem fin du programme
                          
                          :MARQUE4
                          rem touche a
                          start /ABOVENORMAL gencode-%nbrcharmin%-%nbrcharmax%.bat
                          exit
                          rem fin du programme
                          
                          :MARQUE5
                          rem touche l
                          start /LOW gencode-%nbrcharmin%-%nbrcharmax%.bat
                          exit
                          rem fin du programme
                          

                          1. J'ai trouver en fait il suffisait d'inverser les lignes :

                            if %%i GTR %nbrcharmin% set /A !valchar!=0
                            if %%i GTR %nbrcharmax% set !valchar!=n