Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le caractère (") ferme le script en batch.

Le caractère (") dans une condition

Sujet résolu
    23 avril 2017 à 4:32:12

    Le caractère (") dans une condition avec "set /p" en batch

    Bonjour à toute et à tous, voila mon problème: (Je ne savais pas ou poster mon problème)

    •    Je suis en train de programmer un long script et une erreur/problème m'empêche d'avancer. Je veux demander à l'utilisateur du script de rentrer une commande afin de pouvoir l'utiliser dans une condition. Le problème est que si la personne rentre un (") autrement dit un guillemet, le script se ferme. Néanmoins, si la personne en rentre deux, tout se passe comme prévu mais si elle en rentre trois alors encore une fois, le script se ferme. Voila mon code:
    @echo off
    set /a "VAR=1"
    :CHOIX
    set /p "VAR1=Type something:"
        if /i "%VAR1%" == "%VAR%" (
                  echo GOOD
      ) else (
                  echo NOT GOOD
                  goto CHOIX
     )
           Donc voila si la personne entre " le programme se fermera et je n'arrive pas à comprendre pourquoi. Merci d'avance pour les réponses qui seront apportées.


    -
    Edité par SavinoAPH 23 avril 2017 à 16:18:29

    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2017 à 12:03:53

      Bonjour,

      Quand la personne rentre ("), le IF interprète l'intérieur de la guillemet comme une chaîne de caractère, si celle-ci n'est pas fermé ==> erreur. (syntaxe du if incorrecte)

      Tu peux remplacer les caractères (") par rien comme ceci :

      @echo off
      set /a "VAR=1"
      
      :CHOIX
      set /p "VAR1=Type something:"
      set VAR1=%VAR1:"=%
      if /i "%VAR1%" == "%VAR%" (
      	echo GOOD
      ) else (
      	echo NOT GOOD
      	goto CHOIX
      )
      



      -
      Edité par Zaibai 23 avril 2017 à 12:05:30

      • Partager sur Facebook
      • Partager sur Twitter
        23 avril 2017 à 15:54:53

        @zaibai, Merci de ta réponse.

        Malheureusement ça ne marche pas, certes je peux maintenant entrer un " mais lmaintenant, en appuyant sur "entrer" en premier choix le script se ferme alors qu'avant le script ne se fermait pas. N'y a t-il pas une méthode permettant d'éviter le problème de " et de "entrer" simultanément?

        Néanmoins ta commande est intéressante je viens de comprendre son fonctionnement mais voila si ma première réponse est "entrer" alors le script se ferme.

        -
        Edité par SavinoAPH 23 avril 2017 à 16:23:04

        • Partager sur Facebook
        • Partager sur Twitter
          23 avril 2017 à 18:06:58

          Bonjour,

          Update du code (check si la variable est définie ; elle n'est pas définie si elle est vide :p)

          @echo off
          set /a "VAR=1"
           
          :CHOIX
          set /p "VAR1=Type something:"
          IF DEFINED VAR1 set VAR1=%VAR1:"=%
          if /i "%VAR1%" == "%VAR%" (
              echo GOOD
          ) else (
              echo NOT GOOD
          	set VAR1=
              goto CHOIX
          )
          
          

          Quand le if est "not good" pense à réinitialiser ta variable (ligne 11) sinon si au prochain "tour" la personne valide sans saisie, la variable aura toujours la valeur du "tour" d'avant.


          Des exemples de saisie :

          Type something:
          NOT GOOD
          Type something:"entrer"
          NOT GOOD
          Type something:"111111111111111"
          NOT GOOD
          Type something:""""""""""""""""""""1"""""""""
          GOOD
          Type something:""""""""""""""""""""1""""""""
          GOOD
          Type something:""1""
          GOOD
          Type something:1
          GOOD

          EDIT :

          Si tu veux gérer plusieurs caractères (comme les apostrophes [']), voici le code :

          @echo off
          setlocal ENABLEDELAYEDEXPANSION
          set /a "VAR=1"
           
          :CHOIX
          set /p "VAR1=Type something:"
          IF DEFINED VAR1 (
          	set VAR1=!VAR1:"=!
          	set VAR1=!VAR1:'=!
          )
          
          if /i "%VAR1%" == "%VAR%" (
              echo GOOD
          ) else (
              echo NOT GOOD
          	set VAR1=
              goto CHOIX
          )
          




          -
          Edité par Zaibai 23 avril 2017 à 18:16:25

          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2017 à 18:41:00

            Alors d'une part merci pour ta réponse, elle marche pour 80% de mon code, ce qui est déjà une belle réussite, merci, mais vu que tu as l'air de bien mieux te débrouiller que moi voila encore mon problème.

            Mon code offre la possibilité à l'utilisateur de rentrer un chemin (Exemple:"C:\Users") le problème est que s'il tape un mauvais chemin, le code lui fera ressayer. mais s'il tape " alors le code s'arrête. Avec ta solution le problème est qu'il a besoin de ces " en début et en fin de chemin. comme ta solution transforme " en "rien" comment permettre au code de ne pas planter si " est utilisé sans rien tout en lui permettant de garder les " en début et en fin de chemin?.

            Voici mon code: (j'épargne les "if exist" pour une meilleure lecture)

            La le code m'envoie "Vous avez choisis de consulter CHEMIN:"=

            Si j'enlève le "if defined" tout marche bien mais si la personne marque juste " alors bien sur, le programme se ferme. (Je ne pense pas que ce soit possible mais par exemple en transformant " en rien, du coup si la personne entrait """"""""""""""1"""""""""""""" dans l'ancien programme, "GOOD" apparaissait alors que ce n'est pas vraiment la vraie réponse)

            Encore une fois je suis désolé avec mes questions, je suis un peu perectioniste hehe.

            -
            Edité par SavinoAPH 23 avril 2017 à 18:44:51

            • Partager sur Facebook
            • Partager sur Twitter
              23 avril 2017 à 19:03:00

              Je ne vois pas trop pourquoi une personne mettrai juste une guillemet (") en réponse.. :-°

              Ligne 11 il te manque un (%), d'où l'erreur ==> set CHEMIN=%CHEMIN:"=%

              • Partager sur Facebook
              • Partager sur Twitter
                23 avril 2017 à 19:49:24

                Oui mais regarde par exemple:

                avec la fonction "if defined" ce qui permet de ne pas planter le programme, le chemin n'est pas reconnu. Oui je suis d'accord avec toi, pourquoi une personne taperait " sans rien mais mon programme ne doit pas failler comme ça c'est pour ça que je suis sur qu'il y a une méthode...mais inconnue pour moi. En gros si il y a des espaces, l'absence de guillemets fausse le résultat. 

                -
                Edité par SavinoAPH 23 avril 2017 à 19:56:14

                • Partager sur Facebook
                • Partager sur Twitter
                  23 avril 2017 à 20:37:30

                  "En gros si il y a des espaces, l'absence de guillemets fausse le résultat. "

                  Il suffit de les remettres alors ==> IF DEFINED CHEMIN set CHEMIN="%CHEMIN%"

                  Ceci devrait te convenir :

                  @echo off
                  
                  :start
                  echo saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  set /p "CHEMIN=Saisir voitre choix: "
                  IF DEFINED CHEMIN set CHEMIN=%CHEMIN:"=%
                  IF DEFINED CHEMIN set CHEMIN=%CHEMIN:'=%
                  IF DEFINED CHEMIN set CHEMIN="%CHEMIN%"
                  IF DEFINED CHEMIN (goto :choix)
                  goto :start
                  
                  :choix
                  echo vous avez choisis de consulter %CHEMIN%
                  If EXIST %CHEMIN% (
                  dir /S /P %CHEMIN%
                  ) else (
                  echo ce dossier n'existe pas
                  goto :start
                  )
                  echo %cd%
                  pause
                  exit
                  


                  Exemple :

                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix:
                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix: "
                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix: '
                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix: ""
                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix: ''
                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix: C:\chemin\bidon
                  vous avez choisis de consulter "C:\chemin\bidon"
                  ce dossier n'existe pas
                  saisissez votre choix sans oublier les "" en debut et fin de chemin.
                  Saisir voitre choix: D:\Donnees\test
                  vous avez choisis de consulter "D:\Donnees\test"
                   Le volume dans le lecteur D s'appelle DONNEES
                   Le numéro de série du volume est 1E42-77C6
                  
                   Répertoire de D:\Donnees\test
                  
                  23/04/2017  20:35    <REP>          .
                  23/04/2017  20:35    <REP>          ..
                                 0 fichier(s)                0 octets
                  
                       Total des fichiers listés :
                                 0 fichier(s)                0 octets
                                 2 Rép(s)  111 353 131 008 octets libres
                  D:\Users\U144336\Dropbox\Prog Partage
                  Appuyez sur une touche pour continuer...

                  PS : Arrête les MP s'il te plait :ange:

                  -
                  Edité par Zaibai 23 avril 2017 à 20:39:41

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 avril 2017 à 21:57:04

                    Désolé pour les MP, je suis nouveau içi, du coup je ne veux juste pas encombrer le topic pour rien, néanmoins merci tu as résolus 99% de mes problèmes et ça c'est super cool. Du coup avec ta solution je pense que tout est possible pour moi mais je voulais savoir du coup pourquoi dans mon premier code un " faisait planter le programme mais "" ne le faisait pas mais """ le faisait. Et en dernière question, avec ta méthode, " est remplacé par rien donc si la personne fait """"""""""""1"""""""""""" ce sera égale à 1. Je suppose qu'il n'y a pas de méthode pour dire que s'il y a " dans la saisie alors c'est faux?

                    En tout cas merci pour toute l'aide et ton de ton temps, rien à dire.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 avril 2017 à 23:05:12

                       je voulais savoir du coup pourquoi dans mon premier code un " faisait planter le programme mais "" ne le faisait pas mais """ le faisait

                      Voici la réponse fournis dans le second poste du topic :

                      Quand la personne rentre ("), le IF interprète l'intérieur de la guillemet comme une chaîne de caractère, si celle-ci n'est pas fermé ==> erreur. (syntaxe du if incorrecte)

                      Ce qui veut dire, qu'un nombre impair de guillemet, implique que la dernière soit "tout seule", qu'elle n'est pas refermé par une seconde guillemet, ce qui provoque l'erreur de syntaxe dans le IF.

                      si la personne fait """"""""""""1"""""""""""" ce sera égale à 1. Je suppose qu'il n'y a pas de méthode pour dire que s'il y a " dans la saisie alors c'est faux?

                      On peut toujours dire : Si on détecte une ou plusieurs guillemets, on refuse la saisie.

                      J'espère que ce code te conviendra (je l'ai au passage légèrement optimisé) :

                      @echo off
                       
                      :start
                      set /p "CHEMIN=Saisir voitre choix: "
                      
                      :: Si la variable n'est pas définie, on retourne au label :start
                      IF NOT DEFINED CHEMIN goto :start 
                      
                      :: Crée la variable CHEMIN_TMP en remplacant les guillemets par des g
                      set CHEMIN_TMP=%CHEMIN:"=g%
                      
                      :: Crée la variable CHEMIN_TMP2 en remplacant les guillemets par des u
                      set CHEMIN_TMP2=%CHEMIN:"=u%
                      
                      IF NOT %CHEMIN_TMP% EQU %CHEMIN_TMP2% (
                      	echo La saisie contient au moins une guillement !
                      	set CHEMIN=
                      	goto :start
                      )
                      set CHEMIN="%CHEMIN%"
                      
                      echo vous avez choisis de consulter %CHEMIN%
                      If EXIST %CHEMIN% (
                      dir /S /P %CHEMIN%
                      ) else (
                      echo ce dossier n'existe pas
                      goto :start
                      )
                      pause
                      exit
                      


                      Exemple :

                      Saisir voitre choix:
                      Saisir voitre choix: "
                      La saisie contient au moins une guillement !
                      Saisir voitre choix: ""
                      La saisie contient au moins une guillement !
                      Saisir voitre choix: "C:\chemin\bidon"
                      La saisie contient au moins une guillement !
                      Saisir voitre choix: C:\chemin\bidon
                      vous avez choisis de consulter "C:\chemin\bidon"
                      ce dossier n'existe pas
                      Saisir voitre choix: C:\chemin\valide
                      vous avez choisis de consulter "C:\chemin\valide"
                       Le volume dans le lecteur C n’a pas de nom.
                       Le numéro de série du volume est 4618-7874
                      
                       Répertoire de C:\chemin\valide
                      
                      23/04/2017  23:01    <DIR>          .
                      23/04/2017  23:01    <DIR>          ..
                                     0 fichier(s)                0 octets
                      
                           Total des fichiers listés :
                                     0 fichier(s)                0 octets
                                     2 Rép(s)  66 280 071 168 octets libres
                      Appuyez sur une touche pour continuer...



                      Si tu souhaite le faire avec d'autre caractère, il te suffit de dupliquer les lignes 10 et 13.

                      -
                      Edité par Zaibai 23 avril 2017 à 23:31:12

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 avril 2017 à 1:02:30

                        Alors effectivement ça marche mais tu peux m'éclairer sur une chose? Je ne comprends pas la logique du code, 

                        1: on demande a l'utilisateur de rentrer une donnée (ça je comprends)

                        2: création des variables "CHEMIN_TMP" et "CHEMIN_TMP2"

                        En gros, si un guillemet est entré, alors TMP et TMP2 seront differents, mais je ne comprends pas pourquoi si on entre "1" alors TMP et TMP2 seront égaux à CHEMIN. Peux tu m'éclairer s'til-te-plaît ?

                        set CHEMIN_TMP2=%CHEMIN:"=u% (cela veut dire que TMP2 reprend la même valeur que CHEMIN mais change le " s'il y en a un ? )

                        En tout cas déjà un grand merci pour l'aide apportée, je faisais du C avant et malgrès la compléxité de la syntaxe contrairement au batch, le batch est très puissant et nous poser des problèmes de ce genre. 

                        Juste une dernière chose pour finir (oui je sais je demande beaucoup), Je vois beaucoup de scrips avec par exemple !variable! et non %variable%, y a t-il une difference?

                        -
                        Edité par SavinoAPH 24 avril 2017 à 1:43:27

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 avril 2017 à 11:50:45

                          En gros, si un guillemet est entré, alors TMP et TMP2 seront differents, mais je ne comprends pas pourquoi si on entre "1" alors TMP et TMP2 seront égaux à CHEMIN. Peux tu m'éclairer s'til-te-plaît ?

                          Dès qu'il y aura au moins une guillemet, CHEMIN_TMP et CHEMIN_TMP2 seront différent de CHEMIN. Pas de guillemet ==> CHEMIN_TMP et CHEMIN_TMP2 seront égaux à CHEMIN.

                          set CHEMIN_TMP2=%CHEMIN:"=u% (cela veut dire que TMP2 reprend la même valeur que CHEMIN mais change le " s'il y en a un ? )

                          Exactement, cette ligne déclare la variable CHEMIN_TMP2, qui reprend la valeur de CHEMIN, mais en remplaçant chaque guillemet (") par la lettre (u)

                          Juste une dernière chose pour finir (oui je sais je demande beaucoup), Je vois beaucoup de scrips avec par exemple !variable! et non %variable%, y a t-il une difference?

                          Oui il y a une grosse différence, il s'agit de "l'expansion retardée de variables".

                          Si tu continue dans le batch, tu risque fortement d'en avoir besoin je te donne donc un lien qui explique très bien sont fonctionnement : https://www.developpez.net/forums/d697396/general-developpement/programmation-systeme/windows/scripts-batch/explication-l-expansion-retardee/

                          PS : Pense à mettre le sujet en résolu

                          -
                          Edité par Zaibai 24 avril 2017 à 11:54:21

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 avril 2017 à 17:12:17

                            Merci pour ton aide, le sujet est donc résolue, ton aide a été précieuse :)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Le caractère (") ferme le script en batch.

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown