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 :

Souci avec une commande dans un fichier bat


Sujet :

Scripts/Batch

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 102
    Points : 34
    Points
    34
    Par défaut Souci avec une commande dans un fichier bat
    Bonjour, quelqu’un pourrait-il me dire ce qui ne va pas dans cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo voulez- vous faire un autre test (Y/N/F) ?
    echo.
    set /p rep=réponse ?
    echo.
    echo %rep%|FINDSTR /r  ^[0-9]*>nul  / / elle ne fonctionne pas.
    if ERRORLEVEL 1 goto message
    If NOT ERRORLEVEL  1 goto verif
    Je tente tout simplement d’adapter le code d’extinction d’une machine contenu dans un fichier bat, j’ai des difficultés avec cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo %rep%|FINDSTR /r [^0-9]*>nul
    dans le fichier original c’est comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET /P delai=dans combien de temps voulez-vous arrêter la machine ?
    Echo %delai%|findstr /r  ‟[^0-9]” > nul
    If ERRORLEVEL 1 goto TempsValide
    Echo erreur: vous devez saisir un entier valide
    Echo.
    If not ERRORLEVEL 1 goto Suite
    Et comme explication il dit, je cite :
    {
    « Analysons ensemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     echo %delai%|findstr /r "[^0-9]" > nul
    Prenons la première partie :Comme nous l'avons vu plus haut, echo sert tout simplement à afficher le contenu de la variable "delai".
    Le caractère "|", appelé "pipe" ou "tube", que j'utilise, permet d'utiliser en tant qu'entrée de la commande findstr, le résultat de la commande echo, à savoir la saisie de l'utilisateur.

    Passons à la deuxième partie, déjà plus compliquée : findstr /r "[^0-9]"
    Nous n'avons pas encore vu cette commande (Findstr). Elle permet en fait de rechercher des chaînes de caractères dans un fichier ou tout autre chaine de caractères. Le résultat de la recherche est ensuite récupérable grâce à la variable système "ERRORLEVEL".
    "[^0-9]" est une expression régulière. Le caractère ^ indique le début de la chaîne.
    "0-9" indique qu'il faut pouvoir trouver dans la variable delai seulement des caractères compris entre 0 et 9.

    La dernière partie : > nul
    Elle permet grâce au caractère ">" de rediriger dans un fichier dont le nom est saisi à droite, le résultat récupéré à partir des commandes de gauche.
    Ici, nous renvoyons le résultat vers le mot clé "nul", ce qui a pour effet de ne pas créer de fichier. La redirection du résultat permet d'annuler l'affichage de celui-ci sur votre fenêtre.
    En clair, cela permet donc de vérifier que la saisie de l'utilisateur est bien un entier puis conserve le résultat de la recherche dans la variable ERRORLEVEL que nous utilisons juste après.»
    }
    Or dans l’aide de la commande FINDSTR il est bien dit que la regex [^0-9] est une classe inverse, par conséquent elle affiche tout caractère n’appartenant pas au jeu.
    Quelqu’un peut-il m’expliquer ce que je dois comprendre ?

  2. #2
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    Dis nous plutôt ce que tu veux ça sera plus simple !

    Je pense que dans ton cas un simple :

    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
    @echo off	
    
    :start
    set /p "rep=voulez- vous faire un autre test (Y/N/F) ? : "
    
    if /i %rep%==Y goto:OUI
    if /i %rep%==N goto:NON
    if /i %rep%==F goto:FIN
    goto:start
    
    :OUI
    echo je suis dans OUI
    exit/b
    
    :NON
    echo je suis dans NON
    exit/b
    
    :FIN
    echo je suis dans FIN

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 102
    Points : 34
    Points
    34
    Par défaut Souci avec une commande dans un fichier bat
    Bonsoir sachadee,je crois que je dois vraiment être plus explicite. Je voudrais à travers un fichier bat arrêter ma machine,mais ce de façon interactive. C'est à dire que l'utilisateur répond àà certaines questions notamment s'il veut effectivement arrêter sa machine, il lui est également demandé de renseigner le temps avent lequel la machine doit s'arrêter.Tout fonctionne normalement jusqu'au moment ou l'utilisateur défini son temps d'arrêt. je penses que ma commande ne me donne pas l'ERRORLEVEL me permettant d'aller à l’étiquette :TempsValide. voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SET /P delai=dans combien de temps voulez-vous arrêter la machine ?  // je récupère ici le temps renseigné par l'utilisateur avant l'extinction de la machine
    Echo %delai%|findstr /r  ‟[^0-9]” > nul     // je vérifie ici qu'il a effectivement saisi un entier,mais le résultat ne me convient pas. ERRORLEVEL n'est pas 1
    If ERRORLEVEL 1 goto TempsValide
    Echo erreur: vous devez saisir un entier valide
    Echo.
    if NOT ERRORLEVEL 1 goto Suite // c'est toujours cette ligne là qui est exécutée, preuve que mon ERRORLEVEL n'est jamais =1
    
    REM La saisie du delai est valide, on va pouvoir lancer le shutdown
    
    :TempsValide
    shutdown -s -t %delai%

  4. #4
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut [BAT] Tester si une variable est numérique
    Effectivement la clarté évite les pertes de temps

    Fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @echo off
    
    :start
    set /p "$test=Entrer un entier : "
    echo(%$Test%|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul&&goto:OK||goto:KO
    exit/b
    
    :OK
    echo La valeur est num‚rique
    exit/b
    
    :KO
    echo La valeur n'est pas num‚rique
    goto:start
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  5. #5
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut

    Une petite pause s'impose pour voir le résultat sacha
    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
    @echo off
    :start
    set /p "$test=Entrer un entier : "
    echo(%$Test%|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul&&goto:OK||goto:KO
    pause
    exit/b
    
    :OK
    echo La valeur est num‚rique
    Pause
    exit/b
    
    :KO
    echo La valeur n'est pas num‚rique
    goto:start

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 102
    Points : 34
    Points
    34
    Par défaut
    Bonsoir Sachadee et Hackoof, merci pour vos différentes interventions, mais des questions s'imposent à moi. je comprends cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo(%$Test%|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul&&goto:OK||goto:KO
    comme étant un si .... sinon, un IIF en VB. Ce que je ne comprends pas tout à fait c'est d'abord cette répétition là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[-][1-9][0-9]*$ ^[1-9][0-9]*$
    , ça seulement n'aurait-il pas suffit ? car par cette expression, moi je comprends que la regex doit forcément commencer par un numérique compris entre 1 et 9 lesquels pouvant se répétes 0, 1 ou plusieurs fois.
    Aussi que signifie le au début de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[-][1-9][0-9]*$ ^[1-9][0-9]*$
    Enfin que signifie cette expression à la fin de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$"
    . Moi je la comprend
    comme començant et se terminant par 0, et si c'est vraiment le cas, à quoi bon le mettre à la fin d'une expression faisant le même traitement?

    Une dernière question. Comment récupère t-on la valeur ERRORLEVEL de la commande FINDSTR? Car dans mon code je l'utilse ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If ERRORLEVEL 1 goto TempsValide
    Echo erreur: vous devez saisir un entier valide
    Echo.
    if NOT ERRORLEVEL 1 goto Suite
    et j'aimerais bien savoir combien il vaut dans chaque cas.
    Merci encore de réagir.

  7. #7
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    C'est vrai que l'on pourrait résumer la commande à ceçi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /i "^-*0*x*[0-9][0-9]*$"
    Mais le cas du 031 par exemple sera traiter comme étant correct alors qu'il ne l'est pas dans ton cas.

    Dans mon code on traite l'errorlevel indirectement :

    pour comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo salut coolanso | findstr "coolanso" && echo Trouvé || echo pas trouvé
    maintenant si tu veux la même chose avec un IF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo salut coolanso | findstr "coolanso"
    if %errorlevel%==0 echo trouvé
    if %errorlevel%==1 echo pas trouvé
    Ou avec un else :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo salut coolanso | findstr "coolanso"
    if %errorlevel%==0 (echo trouvé) else (echo pas trouvé)
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

Discussions similaires

  1. Problème avec une commande dans un fichier .sh
    Par ploxien dans le forum Réseau
    Réponses: 8
    Dernier message: 19/03/2008, 11h55
  2. Souci avec une variable dans une requete
    Par polianita dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2006, 17h05
  3. [MySQL] Soucis avec une insertion dans une base
    Par Ludo75 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 27/01/2006, 14h03
  4. Réponses: 7
    Dernier message: 05/10/2005, 18h06
  5. Ecrire le résultat d'une commande dans un fichier de l' OS
    Par Labienus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/02/2004, 11h04

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