Fichier .bat avec IF successifs [Résolu]

Fichier .bat avec IF successifs [Résolu] - API Win32 - Programmation

Marsh Posté le 12-08-2012 à 17:23:05    

Salut à tous,
 
Je suis actuellement sur un fichier bat qui me permet d'automatiser la récupération de sauvegardes de ma progression dans un jeu. Ça c'était pour la petite histoire :na: Voici ce que je voudrais que l'une des parties de mon programme fasse pour moi :
Choix 1 ou Choix 2
Quel que soit le choix, demande de confirmation.
Si confirmation, continuer vers le choix en question, sinon (annonce que le choix rentré n'existe pas et) retour à la proposition de choix .
 
Voilà ça tient en 3 lignes, voici maintenant le programme simplifié (je ne le mets pas entre balises de code parce que ça me fait n'importe quoi avec les tabulations) :
 
@echo off
 
:CHOIX
cls
echo Que voulez-vous faire ?
echo 1. Choix 1
echo 2. Choix 2
 
set /P REPONSE=
IF "%REPONSE%"=="1" set /P CONFIRMATION="Etes-vous sur de votre choix 1 ? Si oui, tapez "oui", si non taper "non"."
 IF "%CONFIRMATION%"=="Oui" (
  goto CHOIX1
 ) ELSE (
  IF "%CONFIRMATION%"=="Non" (
   goto CHOIX
  ) ELSE (
   echo.
   echo Ce choix n'existe pas.
   pause
   goto CHOIX
  )
 )
)
IF "%REPONSE%"=="2" set /P CONFIRMATION="Etes-vous sur de votre choix 2 ? Si oui, tapez "oui", si non taper "non"." (
 IF "%CONFIRMATION%"=="Oui" (
  goto CHOIX2
 ) ELSE (
  IF "%CONFIRMATION%"=="Non" (
   goto CHOIX
  ) ELSE (
   echo.
   echo Ce choix n'existe pas.
   pause
   goto CHOIX
  )
 )
)
 
:CHOIX1
cls
echo CHOIX1
pause
exit
 
:CHOIX2
cls
echo CHOIX2
pause
exit
 
Voilà le soucis c'est que le programme n'arrive visiblement pas à passer au cas où la variable "REPONSE" vaut "2". J'ai tout retourné dans tous les sens et je n'arrive pas à voir mon/mes erreur(s) :pfff:  
 
Quelqu'un pourrait-il m'éclairer ?
 
Merci d'avance
 
Nico150394


Message édité par Nico150394 le 03-09-2012 à 00:42:03
Reply

Marsh Posté le 12-08-2012 à 17:23:05   

Reply

Marsh Posté le 13-08-2012 à 22:27:52    

Je pense que tes  set /P CONFIRMATION  doivent être dans les () du if:

Code :
  1. @echo off
  2. :CHOIX
  3. cls
  4. echo Que voulez-vous faire ?
  5. echo 1. Choix 1
  6. echo 2. Choix 2
  7. set /P REPONSE=
  8. IF "%REPONSE%"=="1" (
  9.   set /P CONFIRMATION="Etes-vous sur de votre choix 1 ? Si oui, tapez "oui", si non taper "non"."
  10.   IF "%CONFIRMATION%"=="oui"  (
  11.     goto CHOIX1
  12.   )   ELSE  (
  13.     IF "%CONFIRMATION%"=="non"    (
  14.       goto CHOIX
  15.     )    ELSE    (
  16.       echo.
  17.       echo Ce choix n'existe pas.
  18.       pause
  19.       goto CHOIX
  20.     )
  21.   )
  22. )
  23. IF "%REPONSE%"=="2" (
  24.   set /P CONFIRMATION="Etes-vous sur de votre choix 2 ? Si oui, tapez "oui", si non taper "non"."
  25.   IF "%CONFIRMATION%"=="oui"  (
  26.     goto CHOIX2
  27.   )  ELSE  (
  28.     IF "%CONFIRMATION%"=="non"    (
  29.       goto CHOIX
  30.     )    ELSE    (
  31.        echo.
  32.        echo Ce choix n'existe pas.
  33.        pause
  34.        goto CHOIX
  35.     )
  36.   )
  37. )
  38. :CHOIX1
  39. cls
  40. echo CHOIX1
  41. pause
  42. exit
  43. :CHOIX2
  44. cls
  45. echo CHOIX2
  46. pause
  47. exit


---------------
Seul Google le sait...
Reply

Marsh Posté le 13-08-2012 à 22:46:19    

Salut, merci de ta réponse.
J'ai essayé, ça me parait cohérant, mais malheureusement il y a encore quelque chose qui cloche. L'idéal serait que tu testes le résultat, en fait quand je réponds "Oui" à chacune des confirmations, il dit que ce choix n'existe pas. Quand je réponds "Non", il va au choix correspondant alors que je n'ai pas donné ma confirmation...

Reply

Marsh Posté le 14-08-2012 à 01:35:40    

Nico150394 a écrit :

Salut, merci de ta réponse.
J'ai essayé, ça me parait cohérant, mais malheureusement il y a encore quelque chose qui cloche. L'idéal serait que tu testes le résultat, en fait quand je réponds "Oui" à chacune des confirmations, il dit que ce choix n'existe pas. Quand je réponds "Non", il va au choix correspondant alors que je n'ai pas donné ma confirmation...


Après test, on dirait que quand il nous demande de taper oui/non, peu importe ce qu'on tape la première fois, ça passe pas mais si on recommence ça marche.
C'est comme si set /P CONFIRMATION= ne fonctionnait pas du premier coup!
(encore que il m'affiche toujours CHOIX2 ?)


Message édité par breizhbugs le 14-08-2012 à 01:39:52

---------------
Seul Google le sait...
Reply

Marsh Posté le 14-08-2012 à 01:48:13    

C'est bizarre, non ? Perso je vois pas où est l'erreur... Si t'as une autre idée je suis preneur ;)

Reply

Marsh Posté le 30-08-2012 à 12:15:44    

Nico150394 a écrit :

C'est bizarre, non ? Perso je vois pas où est l'erreur... Si t'as une autre idée je suis preneur ;)


 
En fait, ton problème est assez simple :
 
De base, tu ne peux pas imbriquer plusieurs IF/FOR sous DOS à cause de la manière dont il interprète ses variables.
 
Pour ça, il faut que tu utilises l'option setlocal ENABLEDELAYEDEXPANSION qui te laisse utiliser le caractère supplémentaire "!" pour déclarer tes variables dans tes imbrications de fonctions.
 
En gros, ça donne à peu près ça :
 

Code :
  1. ::#!\bin\ksh :-)
  2. :: Permet a DOS d'interpreter correctement ses variables...
  3. setlocal ENABLEDELAYEDEXPANSION
  4. :: set +x a la M$
  5. @echo off
  6. :: Menu principal
  7. :MENU
  8. cls
  9. echo Que voulez-vous faire ?
  10. echo 1. Choix 1
  11. echo 2. Choix 2
  12. :: Choix utilisateur
  13. set /P _REPLY_=
  14. :: Cas premier choix
  15. if  %_REPLY_% EQU 1 (
  16. :: Confirmation utilisateur
  17. set /P _CONFIRM_= Etes vous sur de vouloir selectionner le choix 1 [O/N] ?
  18. :: Utilisation du caractere "!"
  19. if /I !_CONFIRM_! EQU O (
  20.  goto CHOIX1) else (
  21.   :: Ni oui ni non
  22.   if /I !_CONFIRM_! NEQ N (
  23.    echo Ce choix n'existe pas.
  24.    pause)
  25.   :: Cas different de OUI on retourne forcement au menu principal
  26.   goto MENU)
  27. )
  28. :: Cas second choix
  29. if  %_REPLY_% EQU 2 (
  30. :: Confirmation utilisateur
  31. set /P _CONFIRM_= Etes vous sur de vouloir selectionner le choix 2 [O/N] ?
  32. :: Utilisation du caractere "!"
  33. if /I !_CONFIRM_! EQU O (
  34.  goto CHOIX2) else (
  35.   :: Ni oui ni non
  36.   if /I !_CONFIRM_! NEQ N (
  37.    echo Ce choix n'existe pas.
  38.    pause)
  39.   :: Cas different de OUI on retourne forcement au menu principal
  40.   goto MENU)
  41. )
  42. :: Etiquette choix 1
  43. :CHOIX1
  44. cls
  45. echo CHOIX1
  46. pause
  47. exit
  48. :: Etiquette choix 2
  49. :CHOIX2
  50. cls
  51. echo CHOIX2
  52. pause
  53. exit


Message édité par Neji Hyuga le 31-08-2012 à 08:57:55
Reply

Marsh Posté le 31-08-2012 à 15:54:12    

Merci beaucoup ça marche ;) si j'ai bien compris la commande setlocal ENABLEDELAYEDEXPANSION autorise le "!" et il faut pour cela utiliser if /I et non pas if tout seul qui lui utilise le "%". C'est ça ? Du coup il n'est pas possible d'utiliser plus de 2 variables en même temps, si ?

Reply

Marsh Posté le 31-08-2012 à 19:48:19    

Alors, l'option /I te permet d'ignorer la casse, tu peux donc taper ta réponse aussi bien en minuscule qu'en majuscule.
 
En fait, le problème n'est pas d'imbriquer tes if, car ça, DOS sait le faire.
C'est la déclaration de variables à l'intérieur de ces fonctions qui lui pose problème.
 
ENABLEDELAYEDEXPANSION indique en fait à l'interpréteur de commande qu'il doit interprêter les variables au moment de l'exécution et non au moment ou il parse le script. Sinon, on se retrouve avec des erreurs de syntaxe parce que l'interpréteur de commandes DOS cherche à interprêter les variables contenues dans ta fonction avant même qu'elles ne soient initialisées.
 
Et grâce à cette option, tu peux imbriquer tes déclarations de variables dans autant de if ou de for que tu veux (bon, là je m'avance un peu, je n'ai jamais testé plus de cinq en fait).
 
Edit : un petit exemple à deux balles qui prouve que ça marche :
 

Code :
  1. setlocal ENABLEDELAYEDEXPANSION
  2. @echo off
  3. echo Croyez vous que DOS soit capable d'imbriquer trois fonctions "if" ?
  4. set /P _rep_1_=
  5. if /I %_rep_1_% EQU O (
  6. echo Ok, jusque la c'est normal que ca fonctionne.
  7. set /p _rep_2_= Deuxieme tentative ?
  8. if /I !_rep_2_! EQU O (
  9.  echo Wow, merci ENABLEMACHINTRUC !
  10.  set /P _rep_3_= On tente encore plus d'acrobaties ?
  11.  if /I !_rep_3_! EQU O (
  12.   echo Wouhaaa la je suis impressione !
  13.   set /P _rep_4_= Allez, encore un coup ?
  14.   if /I !_rep_4_! EQU O (
  15.   echo MER IL ET FOU !!)
  16.  )
  17. )
  18. )


Message édité par Neji Hyuga le 31-08-2012 à 19:56:16
Reply

Marsh Posté le 03-09-2012 à 00:41:17    

Nickel merci beaucoup ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed