2017-09-04 5 views
0

Comment puis-je sélectionner plusieurs entrées à partir d'une invite set /P?Comment sélectionner plusieurs entrées à partir d'une invite SET/P?

Un exemple de ce que je veux dire est ci-dessous si j'ai mon fichier batch:

set /p pcws="Please select 1-4: " 

if %pcws%==1 goto 1 
if %pcws%==2 goto 2 
if %pcws%==3 goto 3 
if %pcws%==4 goto 4 

:1 
echo. 
echo Wrong Choice 
pause 
exit 

:2 
echo. 
echo Thanks 
pause 
exit 

:3 
echo. 
echo Try again 
pause 
exit 

:4 
echo. 
echo Have a nice day 
pause 
exit 

Comment pourrais-je écrire ce pour sélectionner plusieurs entrées, par exemple 2et4?

+2

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

+0

[copie possible] (https://stackoverflow.com/questions/24972506/batch-scripting-multiple-selection) – Stephan

Répondre

1

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.