IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Validation numérique 0-9 [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut Validation numérique 0-9
    Bonjour,

    Alors, voici, je veux valider que les caractères de %1 en entrée à la ligne de commande soient entre 0 et 9 avec une longueur de champs maximale de 9 caracètres.

    Voici le code que j'ai produit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FOR /L %%X in (1,1,9) do call :ETAPE000 %1 %%X
    
    :ETAPE000
    set param6=%1
    set position=%2
    
    FOR /L %param6:~%%2,1% %%Y in (0,1,9) DO (
    if errorlevel %%Y (
    echo valeure non numerique en entree
    call :finA 33
    rem la validation est terminée, poursuivre.
    ELSE IF %1 == () exit /b  )
    Les problèmes semblent survenir à la ligne en rouge. quelqu'un peut m'aider à les résoudres?

  2. #2
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Salut,

    Et bien, sur ta ligne rouge, la valeur "%param6:~%%2,1%" n'a rien à faire là.
    Il faut recibler tes intentions.

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    "%param6:~%%2,1%"

    constitue simplement la valeur d'entrée,à la position (%%2) (du for précédent), est-ce qu'il se trouve entre 0-9.

  4. #4
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Bien que c'est erroné, tu ne peux pas quand même pas le placer là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /L %%variable in (début,pas,fin) do commande [paramètres]
    Si tu mets quoi que ce soit entre «/L» et «%%variable», «for» génère une erreur d'interprétation.


    [EDIT]:

    Bon, comme tu as fait l'effort de présenter un script, je vais t'aider à voir les choses sous un autre angle.

    Citation Envoyé par SIMMMMM Voir le message
    Validation numérique 0-9

    Alors, voici, je veux valider que les caractères de %1 en entrée à la ligne de commande soient entre 0 et 9 avec une longueur de champs maximale de 9 caracètres.
    En somme, tu veux que ton paramètre ne contienne que des chiffres (0-9). Donc tu veux que ce soit un nombre. Ensuite, tu veux que ce nombre contienne au plus 9 chiffres. Donc il doit être inférieur ou égal au plus grand nombre de 9 chiffres, c'est-à-dire 999999999.

    Tu peux conclure que pour qu'un nombre passé en paramètre soit valide, il faut qu'il soit compris entre 0 et 999999999.

    Ce qui se traduit par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if %1 geq 0 if %1 leq 999999999 goto validation_ok
    Si le paramètre contient une ou plusieurs lettres, «if» tentera de faire une comparaison alphanumérique, ce qui évidemment échouera.
    Voilà, en une ligne tu es arrivé à tes fins. Cela dit, quelques garde-fous supplémentaires rendront la chose un peu plus optimale.

    Bonne continuation SIMMMMM et bienvenue sur le forum.

  5. #5
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Voilà une réponse qui me satisfait. Merci beaucoup ça va simplifier ma journée. Alors, passe une belle journée toi aussi!!

  6. #6
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Comment se fait il que dans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    set valide=3
    if %1 geq 0 if %1 leq 999999999 set Valide=0
    if %Valide% NEQ 0 (
       SET CODE=33
       CALL :FinA %CODE%
       exit /b
      )
     echo %1
    echo valide
    exit /b
    si je met 199dsw comme paramètre d'entrée, le programme met Valide=0 comme s'il etait entre 0 et 9999999???

  7. #7
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Il faudrait voir de quelle version de Windows tu disposes.

    Cela dit, je ne peux pas mettre en cause tes deux lignes puisqu'elles sont correctes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set valide=3
    if %1 geq 0 if %1 leq 999999999 set Valide=0
    Mais bon, ce n’est pas grave. On va agir autrement en faisant appel à la commande «set». On va profiter de cette occasion pour exclure les valeurs hexadécimales et surtout octales qui risquent de provoquer des résultats inattendus, et on en fait de même pour 0. Comme ça au moins, tu auras déjà une longueur d'avance, et un temps de gagner certain, sur les obstacles que tu serais susceptible de rencontrer.

    Voici donc une composition qui compare quelques différentes approches. Ça te permettra d'en choisir une et dans le même temps, de faire des tests pour éclaircir le problème que tu citais précédemment. La dernière [vldMc] devrait te convenir. Le script est structuré d'une manière assez simple pour ne pas être commenté.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    ::// [example | sample] by maxim_um for http://www.developpez.net/
    ::
    @echo off
    set ParamATester=111m m199smv 1212 0 1xpod 0132 none1 199smv 312 156 555555
    echo.
    echo OP1:
    echo îîîî
    for %%i in (%ParamATester%) do call :vldMa %%i
    echo.
    echo OP2:
    echo îîîî
    for %%i in (%ParamATester%) do call :vldMb %%i
    echo.
    echo OP3:
    echo îîîî
    for %%i in (%ParamATester%) do call :vldMc %%i
    echo.
    goto fin
    
    
    :vldMa
    set ret=no
    if %1 leq 999999999 if %1 gtr 0 set ret=yes
    echo %1	: %ret%
    goto :eof
    
    :vldMb
    set ret=no
    if %1 gtr 0 if %1 leq 999999999 set ret=yes
    echo %1	: %ret%
    goto :eof
    
    :vldMc
    set Param=%1
    ::initialisation des valeurs par défaut
    set eval=0
    set ret=no
    ::validation numérique
    set /a eval=%1 >NUL 2>&1
    ::exclusion de toute valeur non décimale
    if "%Param:~0,1%"=="0" set eval=0
    ::exclusion de 0 avec gtr
    if %eval% gtr 0 if %eval% leq 999999999 set ret=yes
    echo %Param%	: %ret%
    goto :eof
    
    :fin
    pause
    [EDIT]

    Bon ben j'ai quand même fait un peu de commentaires.
    Il faudra aussi penser à ajouter une ligne qui vérifie que le paramètre n'est pas une chaine vide.

    enjoy;

  8. #8
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Bonjour,

    Ma version est: Microsoft Windows XP [version 5.1.2600]

    Le champs vide est déjà traîté.

    Merci beaucoup!

    Afin d'éviter les hexa et octa, je vais m'assurer que PARAM est GEQ 1.

    Je ne comprend pas ton : set /a eval=%1 >NUL 2>&1

  9. #9
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Citation Envoyé par SIMMMMM Voir le message
    Afin d'éviter les hexa et octa, je vais m'assurer que PARAM est GEQ 1.
    Dans ce que je t'ai fourni, le contrôle je l'effectue sur «eval» pas sur «Param».
    Les valeurs à exclure sont par exemple 0x123, 08 ... le premier est bien un nombre, le deuxième va simplement planter ton script parce qu'il ressemble à
    une valeur octale qui n'existe pas.

    [EDIT]

    Cette commande permet d'évaluer l'expression, si elle réussi, eval vaut param sinon eval vaut 0.

  10. #10
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    C'est très étrange, regarde le code ci-bas, ce sont mes validations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    rem ********************** VALIDER QUE LE PARAM EST ENTRE 1 ET 999999999 *************
    set Valide=1
    if %1 gtr 0 if %1 leq 999999999 set Valide=0
    echo %Valide% valide 0?
    if /I %Valide% NEQ 0 (
       SET CODE=33
       goto FinA %CODE%
       exit /b
    )
    rem *** si parametre vide
    IF (%1)==() (
      set CODE=66
      goto finA 66
      exit /b
    )
    set nbJours=%1
    set CODE=000
    
    set Valide=5
    set /A Valide=%1 >NUL 2>&1
    pause
    echo ***** si paramètre non numerique
    if /I %Valide% EQU 0 (
       set CODE=67
       goto FinA %CODE%
    )
    Comment se fait-il que si je passe le parametre 434242grte il entre dans la boucle code 33??? alors que je voudrais qu'il retourne le code 67. Comment dois-je procéder?

  11. #11
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Citation Envoyé par SIMMMMM Voir le message
    Comment se fait-il que si je passe le parametre 434242grte il entre dans la boucle code 33??? alors que je voudrais qu'il retourne le code 67.
    Tout simplement parce que tu n'as pas réutilisé correctement le script exemple que je t'ai fourni. «:vldMc» y suit un cheminement logique. Tu ne peux pas dispatcher ses différentes commandes dans ton code en espérant que ça marche. Il faut utiliser tout le bloc, toutefois tu peux renommer les variables si tu veux. Pour info, à peu de choses près, tu viens de reproduire la même chose que dans ton poste #6, qui génère donc la même erreur, et ce pour quoi je t'ai répondu en poste #7.

  12. #12
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Citation Envoyé par SIMMMMM Voir le message
    C'est très étrange, regarde le code ci-bas, ce sont mes validations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    rem ********************** VALIDER QUE LE PARAM EST ENTRE 1 ET 999999999 *************
    set Valide=1
    if %1 gtr 0 if %1 leq 999999999 set Valide=0
    echo %Valide% valide 0?
    if /I %Valide% NEQ 0 (
       SET CODE=33
       goto FinA %CODE%
       exit /b
    )
    rem *** si parametre vide
    IF (%1)==() (
      set CODE=66
      goto finA 66
      exit /b
    )
    set nbJours=%1
    set CODE=000
    
    set Valide=5
    set /A Valide=%1 >NUL 2>&1
    pause
    echo ***** si paramètre non numerique
    if /I %Valide% EQU 0 (
       set CODE=67
       goto FinA %CODE%
    )
    Comment se fait-il que si je passe le parametre 434242grte il entre dans la boucle code 33??? alors que je voudrais qu'il retourne le code 67. Comment dois-je procéder?
    salut maxim_um,
    salut SIMMMMM,

    il faut adapter le code de maxim_um dans ton code..et à mon avis il faut repenser ton code "l'algorithme"..

    sinon voici une autre approche en utilisant les RegExp uniquement (pas bien testez !)

    avant tout il faut savoir que vous ne pouvez pas dépasser les: 2147483647 si vous traitez votre chaîne comme étant un nombre..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @echo off
    setlocal
    
    set/p "_test=--> "
    
    for %%: in ( . .. ... .... ..... ...... ....... 
                      ........ ......... .......... ) do >>f.exp echo/^^%%:$
    
    set VALID=FALSE
    
    echo:%_test% | findstr -irc:"[a-z\-]" -rc:"^0[0-9].*">nul || (
      if defined _test (echo:%_test% | findstr /g:"f.exp"&& (set VALID=TRUE))
      REM # if "%_test%" leq "999999999" (set VALID=TRUE)
    )
    
    set VALID
    
    del f.exp
    endlocal&pause

  13. #13
    Membre averti
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Bonjour!

    Bon j'ai réussi à venir à mes fins en jonglant avec mon code et en imbriquant les IF d'erreurs.

    pour votre aide encore une fois!



+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 12/05/2010, 22h28
  2. validation d'un champ numérique - fonction proposée par la FAQ
    Par sahuni dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/11/2009, 20h50
  3. [Débutant] Validation d'une valeur numérique dans une variable String
    Par anto84 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 11/07/2007, 10h26
  4. Réponses: 7
    Dernier message: 07/03/2006, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo