Deux commandes sont disponibles pour les invites utilisateur sur la ligne de commande Windows:
- défini avec l'option
/P
disponible 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 /P
d'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.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 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.bat
utilisation 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
cmd
raison 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.exe
non 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.com
plutôt cmd.exe
que 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.bat
sous 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.bat
entraî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, UserChoice
avec YSPACE comme valeur, cela entraînerait l'exécution de l'invite une deuxième fois avec l'option N
dé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
UserChoice
avec N
et Y
, mais la valeur de UserChoice
entouré de "
avec "N"
et "Y"
.
- Les opérateurs de comparaison IF
EQU
et NEQ
sont conçus pour comparer deux entiers compris entre -2147483648 et 2147483647 et non pour comparer deux chaînes. EQU
et NEQ
fonctionne é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. EQU
et NEQ
ne 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.com
MS-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 :EOF
né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=N
avant 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é.