Boucle for dans un batch

Résolu
vladivostok Messages postés 239 Statut Membre -  
vladivostok Messages postés 239 Statut Membre -
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. cchristian Messages postés 928 Statut Membre 131
     
    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,
    0
  2. vladivostok Messages postés 239 Statut Membre 20
     
    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
    0
  3. vladivostok Messages postés 239 Statut Membre 20
     
    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
    0
    1. cchristian Messages postés 928 Statut Membre 131
       
      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 :
      )
      0
  4. cchristian Messages postés 928 Statut Membre 131
     
    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!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. vladivostok Messages postés 239 Statut Membre 20
     
    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.
    0
  7. cchristian Messages postés 928 Statut Membre 131
     
    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.
    0
  8. vladivostok Messages postés 239 Statut Membre 20
     
    oki je regarde merci
    0
  9. vladivostok Messages postés 239 Statut Membre 20
     
    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
    )
    
    0
  10. cchristian Messages postés 928 Statut Membre 131
     
    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
    )
    0
  11. vladivostok Messages postés 239 Statut Membre 20
     
    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.
    0
  12. cchristian Messages postés 928 Statut Membre 131
     
    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 ?
    0
  13. vladivostok Messages postés 239 Statut Membre 20
     
    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 ^^
    0
  14. cchristian Messages postés 928 Statut Membre 131
     
    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.
    0
  15. vladivostok Messages postés 239 Statut Membre 20
     
    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
    

    0
  16. vladivostok Messages postés 239 Statut Membre 20
     
    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
    0