> Tous les forums > Forum Windows 7
 Souci avec une commande dans un fichier bat
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
pytheas
  Posté le 02/08/2014 @ 14:42 
Aller en bas de la page 
Petit astucien
Bonjour, quelqu’un pourrait-il me dire ce qui ne va pas dans cette commande :

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 :

echo %rep%|FINDSTR /r [^0-9]*>nul

dans le fichier original c’est comme ça :

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 la ligne 33 : echo %delai%|findstr /r "[^0-9]" > nul

Prenons la première partie : echo %delai%

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, cette ligne 33 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 ?

Publicité
Titus68
 Posté le 02/08/2014 à 17:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonjour,

Sinon quelquechose comme çà ?

@echo on
:boucle
set /p rep=réponse ou FIN ?
if "%rep%" EQU "FIN" goto fin
set /A test=10 * %rep%
if "%test%" EQU "0" goto invalide
if "%test%" NEQ "" goto ok
:invalide
echo Reponse invalide
goto boucle
:ok
echo OK
:fin
pause

Titus68
 Posté le 02/08/2014 à 18:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

En fait la commande fonctionne, remplacer :

echo %rep%|FINDSTR /r ^[0-9]*>nul

par

echo %rep%|findstr /r "[^0-9]" > nul

pytheas
 Posté le 06/08/2014 à 20:06 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonsoir Titus68, je crois qu'il y a un hic dans notre commande findstr. Je m'explique: 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 avant 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

SET /p delai=Dans combien de temps voulez-vous arreter votre machine ?

echo %delai%|findstr /r "[^0-9]" > nul // ici je contrôle la saisie de l'utilisateur,il faut que ce soit un entier, sinon le message d'erreur " vous devez saisir un entier valide" s'affiche

echo.

if ERRORLEVEL 1 goto TempsValide // si la saisie est bonne, cad si c'est un entier on va à l'étiquette TempsValide dans laquelle on éteint proprement dit la machine selon %delai%

echo ERREUR: Vous devez saisir un entier valide

echo.

if NOT ERRORLEVEL 1 goto Suite

En remplaçant ma commande echo %rep%|FINDSTR /r ^[0-9]*>nul par la sienne echo %delai%|findstr /r "[^0-9]" > nul c'est toujours le même résultat. TempsValide n'est jamais exécuté si bien que j'obtiens toujours le message d'erreur " Vous devez saisir un entier valide "

Question: n' y a t-il pas un moyen de récupérer la valeur ERRORLEVEL rendu par la commande FINDSTR ? si oui comment ?

Aussi en consultant l'aide de la commande FINDSTR il est dit que :

[^class] Classe inverse : tout caractère n'appartenant pas au jeu, ce qui selon moi veut dire que ta commande echo %delai%|findstr /r "[^0-9]" > nul ne prendra en compte aucune valeur numérique.

Titus68
 Posté le 06/08/2014 à 21:27 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Bonsoir Pytheas,

Chez moi çà fonctionne, exemple

@echo off
:saisidelai
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.
goto saisidelai
:TempsValide
echo ok
pause

et voici le résultat :

Sinon pour voir la valeur de ERRORLEVEL, faire :

Echo %delai%|findstr /r "[^0-9]" > nul

echo Code retour=%ERRORLEVEL%
If ERRORLEVEL 1 goto TempsValide

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
trouver fichier *.txt avec mot clé dans rep précis
problémes avec transfert de fichier
Ajouter un programme dans "ouvrir avec"
Fichier texte enregistré dans bloc note ne s'ouvre pas ?
Problème avec Provider for Google Agenda dans Thunderbird
Ouvrir avec LibreOffice (par défaut) dans ma session (W7 nl)
fichier dans dossier
Restore un fichier ou un dossier avec Paragon Backup & Recovery 2014 Free é
fichier créé sur word 2007...illisible avec word 2002...
Insertion ouy déplacement d'images dans fichier photos
Plus de sujets relatifs à Souci avec une commande dans un fichier bat
 > Tous les forums > Forum Windows 7