Boucle for dans un batch

Résolu/Fermé
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 - 7 août 2009 à 17:37
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 - 10 août 2009 à 14:31
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 ...
A voir également:

15 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
8 août 2009 à 01:29
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
8 août 2009 à 11:40
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
8 août 2009 à 14:23
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
8 août 2009 à 14:42
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
8 août 2009 à 14:35
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
8 août 2009 à 14:44
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
8 août 2009 à 14:51
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
8 août 2009 à 15:04
oki je regarde merci
0
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
9 août 2009 à 14:22
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
9 août 2009 à 15:26
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
9 août 2009 à 17:46
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
9 août 2009 à 17:59
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
9 août 2009 à 18:03
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
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
9 août 2009 à 19:32
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
9 août 2009 à 19:57
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
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
10 août 2009 à 14:31
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