Voici le code de lot réécrite et commenté à accepter toute combinaison de 1
, 2
, 3
ou 4
ainsi que toute entrée non valide.
@echo off
rem Enable delayed expansion as the user as the freedom to enter any string
rem like an empty string or a string containing 1 or more double quotes or
rem command line operators which could result in undefined behavior or exit
rem of batch execution because of a syntax error on evaluation without using
rem delayed expansion. Please note that not escaped exclamation marks are
rem not interpreted anymore as literal characters, but as begin or end of
rem a delayed expanded environment variable reference.
setlocal EnableExtensions EnableDelayedExpansion
:UserPrompt
cls
set "ValidChoice=0"
set "pcws="
set /P "pcws=Please select 1-4: "
rem Was anything entered by the user at all?
if not defined pcws goto UserPrompt
rem The 4 IF conditions below compare if the user input string with all
rem 1, 2, 3 or 4 replaced by nothing is not equal with the unmodified
rem user input string which means it checks if the user input string
rem contains one or more times 1, 2, 3 or 4.
:UserChoice
echo/
if not "!pcws:1=!" == "!pcws!" set "ValidChoice=1" & goto Choice1
if not "!pcws:2=!" == "!pcws!" set "ValidChoice=2" & goto Choice2
if not "!pcws:3=!" == "!pcws!" set "ValidChoice=3" & goto Choice3
if not "!pcws:4=!" == "!pcws!" set "ValidChoice=4" & goto Choice4
rem Has the user entered at least one of the requested characters?
if %ValidChoice% == 0 goto UserPrompt
endlocal
goto :EOF
:OneMoreChoice
echo/
pause
rem Remove all 1, 2, 3 or 4 from user input string.
set "pcws=!pcws:%ValidChoice%=!"
rem Is the environment variable still defined which means the
rem user input string contains perhaps more choices to process?
if defined pcws goto UserChoice
endlocal
goto :EOF
:Choice1
echo Wrong choice^^!
goto OneMoreChoice
:Choice2
echo Thanks.
goto OneMoreChoice
:Choice3
echo Please try again.
goto OneMoreChoice
:Choice4
echo Have a nice day.
goto OneMoreChoice
sur l'exécution du fichier batch l'utilisateur peut entrer
- rien ... prompt apparaît à nouveau;
"<>|
... l'invite s'affiche à nouveau;
4321
... les 4 messages sont sortis et le traitement du fichier par lots se termine;
1>nul
... le premier message est envoyé et le traitement du fichier par lots se termine;
2,3
... le deuxième et le troisième message sont sortis et le traitement du fichier par lots se termine;
2-4
... le deuxième et le quatrième message sont sortis et le traitement du fichier par lots se termine.
Il est également possible d'insérer au-dessus des lignes de commentaire ci-dessus étiquette UserChoice
lignes de commande suivantes:
rem Accept only a user input containing the digits 1-4 without any other
rem character between or with space(s) or comma(s) anywhere in string.
for /F "delims=,1234 " %%I in ("!pcws!") do goto UserPrompt
Le supplémentaire pour résultats de la ligne de commande dans un saut à étiqueter UserPrompt
si la chaîne d'entrée contient une autre caractère que ,1234
ou un caractère espace. Les entrées de test 1>nul
et 2-4
ne seraient plus acceptées avec la ligne de commande supplémentaire FOR. Seulement 4321
, 2,3
et par exemple 1,3 4, 2
serait encore interprété comme une chaîne d'entrée valide étant encore traitée. 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.
cls /?
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
rem /?
set /?
setlocal /?
Voir aussi Single line with multiple commands using Windows batch file pour une explication de l'opérateur &
utilisé pour exécuter deux commandes sur une seule ligne de commande pour éviter l'utilisation de blocs de commande.
Et lisez aussi le sujet du forum DosTips ECHO. FAILS to give text or blank line - Instead use ECHO/ pourquoi il vaut mieux utiliser echo/
au lieu de echo.
pour sortir une ligne vide.
Vous pouvez utiliser 'goto% pcws%' à la place de tous les 'if'. Vous pouvez aussi utiliser 'choice/N 1234' au lieu de' set/p pcws = ... 'et' goto% errorlevel% 'après. – Aacini
[copie possible] (https://stackoverflow.com/questions/24972506/batch-scripting-multiple-selection) – Stephan