[Batch] Problème

Résolu/Fermé
camille18 Messages postés 285 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 1 mars 2012 - 5 mars 2010 à 22:33
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 7 mars 2010 à 15:27
Bonjour,
Alors voila, je suis en train de créé un petit programme (histoire de m'occuper un peu ^^) qui contient un menu avec utilisation de plusieurs pages. Le problème est que dans le code ci dessous ont peux mettre qu'un seul set PAGE=x dans la %PAGE%==0. C'est pourquoi j'aurais aimé savoir si il existait un moyen de contourner ce problème.

Merci d'avance !! =D
Cordialement.



Code du programme en cours :


@echo off
Title Ressurection
mode con cols=100 lines=50 &color 0A
set AFFICHAGE= By Geek !!
set LAPAGE=TRUE
set PAGE=0


:UP

cls
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º º
echo º %AFFICHAGE% º
echo º º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo.

if %LAPAGE%==TRUE (
set LAPAGE=FALSE
set AFFICHAGE= xD Good !!
)
if %PAGE%==0 (
echo 1. Changer de mot de passe
echo.
echo 2. Supprimer session
echo.
echo 3. eteindre son ordinateur
echo.
echo.
set /p REP= Que desirez vous faire ?
set PAGE=1
goto :UP
)
if %PAGE%==1 (
if %REP%==1 (
set PAGE=2
set /p NOMADMIN=Veuillez indiquer le nom de l'administrateur en question \\:
goto :UP
))
if %PAGE%==1 (
if %REP%==o (
set page=1
))
if %PAGE%==2 (
net user %NOMADMIN% *
echo.
echo.
echo.
echo.
echo.
echo.
set /p REC= 1. Appuyer sur [Entree] pour retourner au menu.
echo.
start Ressurection
exit
)
if %PAGE%==3 (
if %REP%==3 (
set /p ARRET=Choisisser le nombre de secondes avant l'arret de votre ordinateur \\:
set PAGE=4
goto :UP
)
if %PAGE%==4 (
echo Votre ordinateur va s'arreter dans le temps impartis.
shutdown -s -t %ARRET% -c "Votre ordinateur va s'arreter dans quelques instants"
goto :UP
))







pause>nul

6 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
6 mars 2010 à 02:58
Bonsoir,

ont peux mettre qu'un seul set PAGE=x dans la %PAGE%==0. C'est pourquoi j'aurais aimé savoir si il existait un moyen de contourner ce problème.

Je ne suis pas certain d'avoir bien compris ton problème. Je te propose cette solution (à améliorer....... Je n'ai pas voulu trop retoucher à ta logique):

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SETLOCAL  ENABLEEXTENSIONS
Title Ressurection
mode con cols=100 lines=50 &color 0A

:INIT
set "AFFICHAGE= By Geek !!"
set LAPAGE=TRUE
set /A PAGE=0
SET "REP="
SET "lib_ano="

:UP

cls
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º º
echo º %AFFICHAGE% º
echo º º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo.

if %LAPAGE%==TRUE (
set LAPAGE=FALSE
set "AFFICHAGE= xD Good !!"
)

if !PAGE!==0 (
echo 1. Changer de mot de passe
echo.
echo 2. Supprimer session
echo.
echo 3. eteindre son ordinateur
echo.
echo.
ECHO !lib_ano!.
set /p REP= Que desirez vous faire ?
IF  "!REP!"           ==   ""                            (
      SET "lib_ano= Choix errone. Saisissez 1, 2 ou 3"
rem      GOTO                         :UP
) ELSE (
      set /A PAGE=1                                       )
goto :UP
)

if !PAGE!==1 (
if "!REP!"=="1" (
set /A PAGE=2
set /p NOMADMIN=Veuillez indiquer le nom de l'administrateur en question \\:
goto :UP
))

rem Là je n'ai pas compris. J'ai ignoré la séquence. 
rem if %PAGE%==1 (
rem if "%REP%"=="o" (
rem set /A page=1
rem ))


if !PAGE!==2 (
net user !NOMADMIN! *
echo. & echo. & echo. & echo. & echo. & echo.
set /p REC= 1. Appuyer sur [Entree] pour retourner au menu.
echo.
rem start Ressurection
goto :INIT
rem exit
)
if !PAGE!==1 (
if "!REP!"=="3" (
set /p ARRET=Choisisser le nombre de secondes avant l'arret de votre ordinateur \\:
set /A PAGE=4
goto :UP     )   )

if !PAGE!==4 (
echo Votre ordinateur va s'arreter dans le temps impartis.
shutdown -s -t %ARRET% -c "Votre ordinateur va s'arreter dans quelques instants"
             )

echo. & echo. & echo. & echo. & echo. & echo.
ECHO FIN NORMALE DE %0 EXECUTE AVEC LE CHOIX !REP!
pause>nul

0
camille18 Messages postés 285 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 1 mars 2012 14
6 mars 2010 à 09:35
Okey ! Sa marche impéc' =)
Merci beaucoup pour avoir pris du temps à régler mon problème !!
Je vais pouvoir poursuivre mon programme :)

J'aurais juste souhaité quelques explications sur les changements que tu as fais afin de mieux comprendre comment sa marche, si tu as encore du temps à m'accorder.

Bye bye, merci encore !!
Cordialement.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
6 mars 2010 à 16:08
Bonjour,

Je te fournirai les explications demain car aujourd'hui je n'ai pas beaucoup de temps, je suis "d'anniversaire" .

A demain.
0
camille18 Messages postés 285 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 1 mars 2012 14
6 mars 2010 à 17:06
Okey, pas de problème, merci beaucoup !!
Et passe une bonne anniversaire ! :)
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
7 mars 2010 à 03:44
Bonsoir,

Voici, insérées dans le programme les explications promises. Si tu les estimes incomplètes n'hésite pas à me poser des questions, j'essaierai d'y répondre.


@echo off

:: Activation de l'expansion retardee des variables d'environnement.
SETLOCAL ENABLEDELAYEDEXPANSION
:: Activation des extensions de commandes.
SETLOCAL  ENABLEEXTENSIONS

Title Ressurection
mode con cols=100 lines=50 &color 0A

:INIT
set "AFFICHAGE= By Geek !!"
set LAPAGE=TRUE
SET "REP="
:: (Invite de commandes) HELP SET (1ère page):
:: L'option /A spécifie que la chaîne à droite du signe égal est une
:: expression numérique qui est évaluée.
SET /A PAGE=0
:: L'affectation et la mise à nul comme ci-dessous d'une variable non numéri-
::   que doit être comprise entre double quotes ("). Idem pour les tests.
rem SET "REP="
SET "lib_ano=_"
:: Le non respect de ces 2 regles (peut) engendre(r) des résultats imprévisibles
::    notamment lors des tests mettant en oeuvre ces variables (voir plus bas).

:UP

cls
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º º
echo º %AFFICHAGE% º
echo º º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.
echo ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
echo.

if %LAPAGE%==TRUE (
set LAPAGE=FALSE
set "AFFICHAGE= xD Good !!"
)

:: !...! (Invite de commandes) HELP SET (2ème page):
::Enfin, la prise en charge de l'expansion retardée de variables d'environnement
::  a été ajoutée. Cette prise en charge est toujours désactivée par défaut....
:: Etudie l'exemple du help set,  il résume le problème.
::   set VAR=avant
::   if "%VAR%" == "avant" (
::       set VAR=après
::       if "%VAR%" == "après" @echo Cela marche si vous lisez ce message )
::   .............................
:: Pour illustrer ce propos change la ligne (situee plus bas apres set /p):
:: IF  "!REP!"           ==   ""                           (
::  en
:: IF  "%REP%"           ==   ""                           (
::  et fais un test. Bien que coherente, il te faudra valider (Touche enter)
::  a 2 reprises ta saisie.
::  Je pense, sans pouvoir preciser davantage, que nous nous trouvons en
::  présence d'un cas analogue a celui cité dans le help.
::  Pour m'affranchir de ces contraintes je programme toutes mes variables
::  avec "!" au lieu de "%" apres avoir code : SETLOCAL ENABLEDELAYEDEXPANSION
::  (Voir en debut de ce fichier).

if %PAGE%==0 (
   :: Si !PÄGE!=0, Affichage du menu gans le cas 1ere fois ou cas anomalie.
echo 1. Changer de mot de passe
echo.
echo 2. Supprimer session
echo.
echo 3. eteindre son ordinateur
echo.
echo.
:: Affichage systématique d'une ligne message (un "_" ou un message d'anomalie)
ECHO !lib_ano!
:: "...", regle ennoncee plus haut. Permet egalement de degager un espace final.
set /p "REP= Que desirez vous faire ? "
:: Test de présence d'une valeur effectivement saisie. Il conviendrait de
::  poursuivre les contrôles notamment ceux de cohérence de la valeur effective-
::  ment saisie (ici: 1, 2 ou 3).
IF  "!REP!"           ==   ""                           (
rem Pour test: IF  "%REP%"           ==   ""                           (
        :: message d'anomalie dans lib_ano pour prochain affichage.
      SET "lib_ano= Choix !REP! errone. Saisissez 1, 2 ou 3"
) ELSE (
             :: saisie correcte.
      set /A PAGE=1                                      )
goto :UP  )
::Dans les 2 cas on affiche (a nouveau) le cartouche + le menu accompagne d'un
:: message explicite si cas anomalie.


:: "..." et !...!, regles ennoncees plus haut.
if !PAGE!==1 (
if "!REP!"=="1" (
set /A PAGE=2
set /p NOMADMIN=Veuillez indiquer le nom de l'administrateur en question \\:
:: A ajouter: Test de présence d'une valeur effectivement saisie.
goto :UP
))

if !PAGE!==2 (
net user !NOMADMIN! *
echo. & echo. & echo. & echo. & echo. & echo.
set /p REC= 1. Appuyer sur [Entree] pour retourner au menu.
echo.
goto :INIT :: remplace le START et l'exit. Il faut repatir au debut/
rem start Ressurection
rem exit
)

:: Ici la valeur de !PAGE! etait testee  ==3. PAGE n'etait jamais initialisee
::  a cette valeur dans le corps du programme.
if !PAGE!==1 (
if "!REP!"=="3" (
set /p ARRET=Choisisser le nombre de secondes avant l'arret de votre ordinateur \\:
set /A PAGE=4
goto :UP     )   )
:: Le test suivant etait imbrique et subordonne au premier test lui-même
::    incoherent. J'en ai fait 2 tests independants.
if !PAGE!==4 (
echo Votre ordinateur va s'arreter dans le temps imparti.
shutdown -s -t %ARRET% -c "Votre ordinateur va s'arreter dans quelques instants"
             )

echo. & echo. & echo. & echo. & echo. & echo.
ECHO FIN NORMALE DE %0 EXECUTE AVEC LE CHOIX !REP!
pause>nul


Quelques remarques : _______________________________________________________
_ Ta logique était (est) cohérente. Oriente toi maintenant vers la notion de sous-programmes internes (CALL :nom-de-sous-programme .....) ou externes (CALL nom-d'un-.bat ........) au programme en cours. Cela permet de structurer son programme et d'éviter, ou pour le moins, de minimiser les indicateurs et les GOTO.
_ Aère davantage to code notamment en ce qui concerne les IF imbriqués.
_ Commenteles séquences d'instructions.
0

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

Posez votre question
camille18 Messages postés 285 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 1 mars 2012 14
7 mars 2010 à 10:22
Je te remercie beaucoup pour ton aide précieuse !! J'en attendais pas autant !
Je vais suivre tes conseils à lettre et faire de mon mieux pour améliorer ce programme :)

Merci Merci !
Avec tout sa, je vais pouvoir poursuivre ma programmation plus facilement :)

Cordialement.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
7 mars 2010 à 15:27
Bonjour,

Bon courage et merci pour ce retour.

A plus sur CCM, peut-être.
0