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. 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
    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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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,