123 votes

Comment créer une invite "Êtes-vous sûr ?" dans un fichier batch Windows ?

J'ai un fichier batch qui automatise la copie d'un tas de fichiers d'un endroit à l'autre et vice-versa pour moi. Le seul problème, c'est que même si cela m'aide, je continue à sélectionner accidentellement cette commande dans mon tampon de commandes et à écraser en masse les modifications non validées.

De quel code aurais-je besoin dans mon fichier .bat pour qu'il produise " Êtes-vous sûr ? "et m'obligent à taper Y avant d'exécuter le reste du fichier ?

Si autre chose que Y est tapé, il doit quitter l'exécution sur cette ligne.

Lorsque j'appelle exit , il ferme cmd.exe ce qui n'est pas ce que je souhaite.

210voto

Joe Points 60749

Vous voulez quelque chose comme :

@echo off
setlocal
:PROMPT
SET /P AREYOUSURE=Are you sure (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END

echo ... rest of file ...

:END
endlocal

41voto

Steven A. Lowe Points 40596

Essayez le Commande CHOICE , par exemple

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."

26voto

Mofi Points 2690

Deux commandes sont disponibles pour les invites utilisateur sur la ligne de commande Windows :

  • fixer avec option /P disponible sur toutes les versions de Windows NT dont les extensions de commande sont activées et
  • choix.exe disponible par défaut sur Windows Vista et les versions ultérieures de Windows pour les utilisateurs de PC et sur Windows Server 2003 et les versions ultérieures de Windows pour les serveurs.

fixer est une commande interne du processeur de commandes de Windows cmd.exe . L'option /P pour demander à l'utilisateur une chaîne de caractères n'est disponible qu'avec les extensions de commande activées par défaut, car sinon presque aucun fichier batch ne fonctionnerait plus de nos jours.

choix.exe est une application console distincte (commande externe) située dans le dossier %SystemRoot%\System32 . Fichier choice.exe de Windows Server 2003 peut être copié dans le répertoire %SystemRoot%\System32 sur une machine Windows XP pour une utilisation sur Windows XP comme beaucoup d'autres commandes qui ne sont pas disponibles par défaut sur Windows XP, mais qui sont disponibles par défaut sur Windows Server 2003.

La meilleure pratique consiste à privilégier l'utilisation de CHOIX l'utilisation excessive de SET /P pour les raisons suivantes :

  1. CHOIX n'accepte que les clés (respectivement les caractères lus à partir de STDIN ) spécifiée après l'option /C (et Ctrl+C y Ctrl+Break ) et émet un bip d'erreur si l'utilisateur appuie sur une mauvaise touche.
  2. CHOIX ne nécessite pas d'appuyer sur une autre touche que l'une des touches acceptables. CHOIX sort immédiatement dès qu'une touche acceptable est pressée alors que SET /P exige que l'utilisateur termine sa saisie par RETURN o ENTER .
  3. C'est possible avec CHOIX pour définir une option par défaut et un délai d'attente pour continuer automatiquement avec l'option par défaut après quelques secondes sans attendre l'utilisateur.
  4. Le résultat est meilleur si l'on répond automatiquement à l'invite à partir d'un autre fichier batch qui appelle le fichier batch avec l'invite en utilisant quelque chose comme echo Y | call PromptExample.bat sur l'utilisation CHOIX .
  5. L'évaluation du choix de l'utilisateur est beaucoup plus facile avec CHOIX en raison de CHOIX sort avec une valeur correspondant à la touche pressée (caractère) qui est assignée à NIVEAU D'ERREUR qui peut être facilement évaluée par la suite.
  6. La variable d'environnement utilisée pour SET /P n'est pas défini si l'utilisateur n'appuie que sur la touche RETURN o ENTER et il n'a pas été défini avant que l'utilisateur ne soit invité à le faire. La variable d'environnement utilisée sur SET /P La ligne de commande conserve sa valeur actuelle si elle a été définie auparavant et si l'utilisateur appuie simplement sur la touche RETURN o ENTER .
  7. L'utilisateur a la liberté d'entrer n'importe quoi lorsqu'il est invité à saisir des données. SET /P y compris une chaîne de caractères qui entraîne ultérieurement la sortie de l'exécution du fichier batch par cmd à cause d'une erreur de syntaxe, ou lors de l'exécution de commandes qui ne sont pas du tout incluses dans le fichier batch sur un fichier batch mal codé. Il faut faire quelques efforts pour obtenir SET /P la sécurité contre la saisie par erreur ou intentionnellement erronée de la part de l'utilisateur.

Voici un exemple d'invite utilisant la méthode préférentielle CHOIX et alternativement SET /P sur choice.exe n'est pas disponible sur un ordinateur usagé fonctionnant sous Windows.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice

setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice="
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & goto :EOF
if /I not "!UserChoice!" == "Y" goto UseSetPrompt
endlocal
goto Continue

:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]?"
if not errorlevel 1 goto UseChoice
if errorlevel 2 goto :EOF

:Continue
echo So you are sure. Okay, let's go ...
rem More commands can be added here.
endlocal

Remarque : Ce fichier batch utilise des extensions de commandes qui ne sont pas disponibles sous Windows 95/98/ME en utilisant des extensions de commandes. command.com au lieu de cmd.exe comme interprète de commande.

La ligne de commande set "UserChoice=!UserChoice: =!" est ajouté pour permettre d'appeler ce fichier batch avec echo Y | call PromptExample.bat sur Windows NT4/2000/XP et ne nécessitent pas l'utilisation de echo Y| call PromptExample.bat . Il supprime tous les espaces de la chaîne de caractères lue à partir de STDIN avant d'effectuer les deux comparaisons de chaînes.

echo Y | call PromptExample.bat se traduit par Y SPACE est assigné à la variable d'environnement UserChoice . Il en résulterait un double traitement de l'invite en raison des éléments suivants "Y " n'est pas insensible à la casse égal à "N" ni "Y" sans supprimer d'abord tous les espaces. Ainsi, les UserChoice con Y SPACE comme valeur entraînerait l'exécution de l'invite une deuxième fois avec l'option N comme défini par défaut dans le fichier batch lors de la deuxième exécution de l'invite, ce qui entraîne ensuite une sortie inattendue du traitement du fichier batch. Oui, l'utilisation sécurisée de SET /P est vraiment délicate, n'est-ce pas ?

choice.exe sort avec 0 si l'utilisateur appuie sur Ctrl+C o Ctrl+Break et répond ensuite à la question posée par cmd.exe pour terminer le travail par lots avec N pour NO. C'est pourquoi la condition if not errorlevel 1 goto UserChoice est ajouté pour demander à l'utilisateur une nouvelle fois une réponse précise à l'invite par un code de fichier batch avec Y o N . Remerciements composeur pour obtenir des informations sur ce cas d'utilisation spécial possible.

La première ligne sous l'étiquette du lot :UseSetPrompt pourrait également s'écrire comme suit :

set "UserChoice=N"

Dans ce cas, l'entrée du choix de l'utilisateur est prédéfinie avec N ce qui signifie que l'utilisateur peut simplement appuyer sur RETURN o ENTER (ou Ctrl+C o Ctrl+Break et suivant N ) pour utiliser le choix par défaut.

Le texte de l'invite est édité par la commande SET comme indiqué dans le fichier batch. Le texte de l'invite doit donc se terminer par un espace. La commande CHOIX supprime du texte de l'invite tous les espaces normaux de fin et les tabulations horizontales, puis ajoute lui-même un espace au texte de l'invite. Par conséquent, le texte d'invite de la commande CHOIX peut être écrit sans ou avec un espace à la fin. Cela n'a aucune incidence sur le texte de l'invite affiché lors de l'exécution.

L'ordre d'évaluation de l'invite de l'utilisateur pourrait également être complètement modifié comme suggéré par composeur .

@echo off
setlocal EnableExtensions DisableDelayedExpansion
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice

setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice="
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I not "!UserChoice!" == "Y" endlocal & goto :EOF
endlocal
goto Continue

:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]?"
if not errorlevel 2 if errorlevel 1 goto Continue
goto :EOF

:Continue
echo So you are sure. Okay, let's go ...
endlocal

Ce code entraîne la poursuite du traitement du fichier de lot sous l'étiquette du lot. :Continue si l'utilisateur a définitivement appuyé sur la touche Y . Dans tous les autres cas, le code pour N est exécuté, ce qui entraîne la sortie du traitement du fichier batch avec ce code, indépendamment du fait que l'utilisateur ait réellement appuyé sur cette touche, ou qu'il ait saisi quelque chose de différent intentionnellement ou par erreur, ou qu'il ait appuyé sur Ctrl+C o Ctrl+Break et s'est ensuite prononcée sur une sortie rapide de cmd ne pas terminer le travail par lots.

Pour plus de détails sur l'utilisation de SET /P y CHOIX pour demander à l'utilisateur de faire un choix dans une liste d'options, voir la réponse à la question suivante Comment empêcher l'interpréteur de commandes de Windows d'interrompre l'exécution d'un fichier batch en cas de saisie incorrecte de la part de l'utilisateur ?

Quelques indices supplémentaires :

  1. SI compare les deux chaînes à gauche et à droite de l'opérateur de comparaison avec y compris les guillemets. La comparaison insensible à la casse n'est donc pas la valeur de UserChoice con N y Y mais la valeur de UserChoice entouré de " con "N" y "Y" .
  2. En SI opérateurs de comparaison EQU y NEQ sont conçus principalement pour comparer deux entiers compris entre -2147483648 et 2147483647 et non pour comparer deux chaînes de caractères. EQU y NEQ fonctionnent également pour les comparaisons de chaînes, mais aboutissent à une comparaison de chaînes entre guillemets doubles après une tentative inutile de conversion de la chaîne gauche en un entier. EQU y NEQ ne peut être utilisé qu'avec les extensions de commande activées. Les opérateurs de comparaison pour les chaînes de caractères sont == y not ... == qui fonctionnent même avec des extensions de commande désactivées, comme par exemple command.com de MS-DOS et de Windows 95/98/ME les supportent. Pour plus de détails sur SI opérateurs de comparaison voir Symbole équivalent à NEQ, LSS, GTR, etc. dans les fichiers batch de Windows .
  3. La commande goto :EOF nécessite l'activation d'extensions de commandes pour quitter réellement le traitement des fichiers batch. Pour plus de détails, voir Où retourne GOTO :EOF ?

Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez-y les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • choice /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

Voir aussi

17voto

ghostdog74 Points 86060

En choice n'est pas disponible partout. Avec les nouvelles versions de Windows, la commande set La commande /p vous pouvez obtenir l'avis de l'utilisateur

SET /P variable=[promptString]

voir set /? pour plus d'informations

12voto

Bob Smith Points 103

Ici, c'est un peu plus facile :

@echo off
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ...
if not %var%== Y exit

ou

@echo off
echo Are You Sure?[Y/N]
choice /c YN
if %errorlevel%==1 goto yes
if %errorlevel%==2 goto no
:yes
echo yes
goto :EOF
:no
echo no

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X