web-dev-qa-db-fra.com

Comment demander et recevoir une entrée utilisateur dans un fichier .bat et l'utiliser pour exécuter un programme donné?

C'est ce que j'ai jusqu'ici

@echo off
:Ask
echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If %INPUT%=="y" goto yes 
If %INPUT%=="n" goto no
If %INPUT%=="Y" goto yes
If %INPUT%=="N" goto no
:yes
Java -jar lib/RSBot-4030.jar -dev
echo Starting RSbot in developer mode
:no
Java -jar lib/RSBot-4030.jar
echo Starting RSbot in regular mode
pause

Quoi qu'il en soit, si l'utilisateur entre y ou n, il s'exécute toujours en mode -dev.

Comment puis-je le faire fonctionner en mode -dev si la réponse est oui, et en mode normal si la réponse est non. De plus, comment puis-je demander à nouveau si l'entrée n'est pas Y, N, y ou n?

29
Jonathan Beaudoin

Si l'entrée est, disons, N, vos lignes SI sont évaluées comme suit:

If N=="y" goto yes 
If N=="n" goto no
…

C'est-à-dire que vous comparez N avec "y", puis "n" etc., y compris "N". Vous n'obtiendrez jamais de correspondance à moins que l'utilisateur ne décide de saisir "N" ou "y" (c'est-à-dire l'un des quatre caractères, mais entre guillemets).

Vous devez donc soit supprimer " des environs de y, n, Y et N ou les placer autour de %INPUT% dans vos instructions conditionnelles. Je recommanderais ce dernier point, car vous échapperiez ainsi au moins certains des caractères ayant une signification particulière dans les scripts de traitement par lots (si l'utilisateur parvient à les saisir). Donc, voici ce que vous devriez obtenir:

If "%INPUT%"=="y" goto yes 
If "%INPUT%"=="n" goto no
If "%INPUT%"=="Y" goto yes
If "%INPUT%"=="N" goto no

En passant, vous pouvez réduire le nombre de conditions en appliquant le commutateur /I à l'instruction IF, comme suit:

If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no

Le commutateur /I rend les comparaisons insensibles à la casse. Vous n'avez donc pas besoin de contrôles distincts pour des chaînes de casse différentes.

Un autre problème est que, une fois que la commande en mode de développement est exécutée, vous ne pouvez pas sauter par-dessus l’autre commande. Ainsi, si l’utilisateur accepte d’exécuter Java en mode de développement, il l’exécutera à la fois en mode de développement et en mode de développement. mode non développement. Vous avez peut-être besoin d'ajouter quelque chose comme ceci à votre script:

...
:yes
Java -jar lib/RSBot-4030.jar -dev
echo Starting RSbot in developer mode
goto cont
:no
Java -jar lib/RSBot-4030.jar
echo Starting RSbot in regular mode
:cont
pause

Enfin, pour résoudre le problème du traitement des entrées incorrectes, vous pouvez simplement ajouter une autre commande (inconditionnelle) goto juste après les instructions conditionnelles, juste avant le libellé yes, à savoir goto Ask, pour revenir au début de votre script, où l'invite s'affiche l'entrée est demandée, ou vous pouvez aussi ajouter une autre commande ECHO avant le saut, en expliquant que l'entrée était incorrecte, à peu près comme ceci:

@echo off
:Ask
echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no
echo Incorrect input & goto Ask
:yes
...

_ {Remarque: Certaines des questions mentionnées ici ont également été traitées par @xmjx, ce que je reconnais pleinement.} _

38
Andriy M

je fais juste:

set /p input= yes or no
if %input%==yes echo you clicked yes
if %input%==no echo you clicked no
pause
6
poop

Voici un exemple de travail:

@echo off
:ask
@echo echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no
goto ask
:yes
@echo you select yes
goto exit
:no
@echo you select no
goto exit
:exit
@pause
2
elron smith

Je ne connais pas la plate-forme sur laquelle vous travaillez mais j'assume Windows en raison de l'extension .bat.

De plus, je n'ai aucun moyen de vérifier cela, mais il semble que le traitement par lot ignore les lignes If en raison de quelques erreurs et exécute ensuite celle avec -dev.

Vous pouvez essayer ceci en changeant les deux cibles de saut (:yes et :no) avec le code. Si alors la ligne sans -dev est exécutée, vous savez que vos lignes If sont erronées.

Si tel est le cas, veuillez vérifier si == est vraiment le bon moyen de faire une comparaison dans les fichiers .bat.

En outre, à en juger par la façon dont bash effectue ces opérations, %foo=="y" peut être évalué à true uniquement si %foo inclut les guillemets. Alors peut-être que "%foo"=="y" est la voie à suivre.

0
xmjx
echo off
setlocal
SET AREYOUSURE = N
:Prompt
set /P AREYOUSURE=Update Release Files (Y/N)?
if /I %AREYOUSURE% NEQ Y GOTO END
set /P AREYOUSURE=Are You Sure you want to Update Release Files (Y/N)?
if /I %AREYOUSURE% NEQ Y GOTO END

echo Copying New Files

:END

C'est le code que j'utilise régulièrement. J'ai remarqué dans les exemples de ce blog que des citations sont utilisées. Si la ligne de test est modifiée pour utiliser des guillemets, le test n'est pas valide.

if /I %AREYOUSURE% NEQ "Y" GOTO END

J'ai testé sur XP, Vista, Win7 et Win8. Tous échouent lorsque les guillemets sont utilisés.

0
johnggold

Selon la version de Windows, l'utilisation de l'option "Choix" peut s'avérer utile. Pour autant que je sache, la plupart des versions x64, sinon toutes, ne sont pas prises en charge. Une substitution pratique appelée Choice.vbs ainsi que des exemples d’utilisation peuvent être trouvés sur SourceForge sous le nom Choice.Zip.

0
questorfla