Deux commandes sont disponibles pour les invites utilisateur sur la ligne de commande Windows:
- défini avec l'option
/Pdisponible sur toutes les versions de Windows NT avec les extensions de commande activées et
- choice.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 serveur ultérieures de Windows.
set est une commande interne du processeur de commandes Windows cmd.exe. L'option /Pd'inviter un utilisateur à saisir une chaîne n'est disponible qu'avec les extensions de commande activées qui sont activées par défaut, sinon presque aucun fichier de commandes ne fonctionnerait plus de nos jours.
choice.exe est une application console distincte (commande externe) située dans %SystemRoot%\System32. choice.exede Windows Server 2003 peut être copié dans le répertoire %SystemRoot%\System32sur une machine Windows XP pour une utilisation sur Windows XP comme de nombreuses autres commandes non disponibles par défaut sur Windows XP, mais disponibles par défaut sur Windows Server 2003.
Il est recommandé de privilégier l'utilisation de CHOICE à l'utilisation de SET / P pour les raisons suivantes:
- CHOICE n'accepte que les clés (respectivement les caractères lus à partir de STDIN ) spécifiées après l'option
/C(et Ctrl+C) 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. CHOICE se termine immédiatement une fois qu'une touche acceptable est enfoncée tandis que SET / P exige que l'utilisateur termine la saisie avec RETURNou ENTER.
- Il est possible avec CHOICE de 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.
- La sortie est meilleure pour répondre automatiquement à l'invite à partir d'un autre fichier de commandes qui appelle le fichier de commandes avec l'invite en utilisant quelque chose comme l'
echo Y | call PromptExample.batutilisation de CHOICE .
- L'évaluation du choix de l'utilisateur est beaucoup plus facile avec CHOICE car CHOICE sort avec une valeur en fonction de la touche enfoncée (caractère) qui est affectée à ERRORLEVEL qui peut être facilement évaluée ensuite.
- La variable d'environnement utilisée sur SET / P n'est pas définie si l'utilisateur appuie uniquement sur la touche RETURNou ENTERet qu'elle n'a pas été définie avant l'invitation de l'utilisateur. La variable d'environnement utilisée sur la ligne de commande SET / P conserve sa valeur actuelle si elle a été définie auparavant et l'utilisateur appuie simplement sur RETURNou ENTER.
- L'utilisateur a la liberté de saisir quoi que ce soit lorsqu'il est invité avec SET / P, y compris une chaîne qui entraîne plus tard une sortie de l'exécution du fichier batch en
cmdraison d'une erreur de syntaxe, ou dans l'exécution de commandes non incluses du tout dans le fichier batch sur non bon fichier batch codé. Il faut quelques efforts pour sécuriser SET / P contre une entrée utilisateur erronée ou intentionnelle.
Voici un exemple d'invite utilisant le CHOIX préféré et alternativement SET / P sur choice.exenon disponible sur l'ordinateur utilisé exécutant Windows.
@echo off
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=N"
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 errorlevel 2 goto :EOF
:Continue
echo So your are sure. Okay, let's go ...
Remarque: ce fichier de commandes utilise des extensions de commande qui ne sont pas disponibles sur Windows 95/98 / ME en utilisant command.complutôt cmd.exeque comme interpréteur de commandes.
La ligne de commande set "UserChoice=!UserChoice: =!"est ajoutée pour permettre d'appeler ce fichier de commandes echo Y | call PromptExample.batsous Windows NT4 / 2000 / XP et ne nécessite pas l'utilisation de echo Y| call PromptExample.bat. Il supprime tous les espaces de la chaîne lue à partir de STDIN avant d'exécuter les deux comparaisons de chaînes.
echo Y | call PromptExample.batentraîne l' affectation de YSPACE à la variable d'environnement UserChoice. Cela entraînerait le traitement de l'invite deux fois car il "Y "n'est ni insensible à la casse "N"ni égal ni "Y"sans supprimer d'abord tous les espaces. Ainsi, UserChoiceavec YSPACE comme valeur, cela entraînerait l'exécution de l'invite une deuxième fois avec l'option Ndéfinie par défaut dans le fichier de commandes lors de la deuxième exécution de l'invite, ce qui entraînerait ensuite une sortie inattendue du traitement du fichier de commandes. Oui, l'utilisation sécurisée de SET / P est vraiment délicate, n'est-ce pas?
Pour encore plus de détails sur l'utilisation de SET / P et CHOICE pour inviter l'utilisateur à choisir parmi une liste d'options, voir la réponse sur Comment empêcher l'interpréteur de commandes Windows de quitter l'exécution du fichier de commandes sur une entrée utilisateur incorrecte?
Quelques indices supplémentaires:
- IF compare les deux chaînes à gauche et à droite de l'opérateur de comparaison en incluant les guillemets doubles. Par conséquent, la comparaison insensible à la casse n'est pas la valeur de
UserChoiceavec Net Y, mais la valeur de UserChoiceentouré de "avec "N"et "Y".
- Les opérateurs de comparaison IF
EQU et NEQsont conçus pour comparer deux entiers compris entre -2147483648 et 2147483647 et non pour comparer deux chaînes. EQUet NEQfonctionne également pour les comparaisons de chaînes, mais résulte en la comparaison de chaînes entre guillemets doubles sur une tentative inutile de convertir la chaîne de gauche en entier. EQUet NEQne peut être utilisé qu'avec les extensions de commande activées. Les opérateurs de comparaison pour les comparaisons de chaînes sont ==et not ... ==qui fonctionnent même avec des extensions de commande désactivées, car même command.comMS-DOS et Windows 95/98 / ME les ont déjà pris en charge. Pour plus de détails sur les opérateurs de comparaison IF , voir Symbole équivalent à NEQ, LSS, GTR, etc. dans les fichiers batch Windows .
- La commande
goto :EOFnécessite des extensions de commande activées pour vraiment quitter le traitement des fichiers de commandes. 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 les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Voir également:
SET AREYOUSURE=Navant l'invite afin d'effacer le choix si vous avez déjà exécuté le script auparavant dans cette fenêtre de commande. Sans lui, la valeur par défaut restera le choix précédemment sélectionné.