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 :
-
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.
-
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 .
- 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.
- 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 .
- 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.
- 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 .
- 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 :
-
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"
.
- 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 .
- 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