Souci avec une commande dans un fichier bat
Bonjour, quelqu’un pourrait-il me dire ce qui ne va pas dans cette commande :
Code:
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:
echo %rep%|FINDSTR /r [^0-9]*>nul
dans le fichier original c’est comme ça :
Code:
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:
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 ?
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:
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% |
[BAT] Tester si une variable est numérique
Effectivement la clarté évite les pertes de temps ;)
Fait comme ça :
Code:
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 |
;)