Как я могу запросить и получить ввод пользователя в байте и использовать его для запуска определенной программы?
Это то, что я до сих пор
@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
В любом случае, если пользователь вводит y или n, он всегда работает в режиме -dev.
Как заставить его работать в режиме -dev, если ответ "да", и обычный режим, если ответ отрицательный. Кроме того, как мне заставить его задавать снова, если вход не Y, N, y или n?
Ответы
Ответ 1
Если входной сигнал, например, N
, ваши IF-линии оцениваются следующим образом:
If N=="y" goto yes
If N=="n" goto no
…
То есть вы сравниваете N
с "y"
, затем "n"
и т.д., включая "n"
. Вы никогда не получите совпадение, если пользователь каким-то образом не примет решение ввести "n"
или "y"
(т.е. Один из четырех символов, но заключен в двойные кавычки).
Таким образом, вам нужно либо удалить "
из y
, N
, y
и N
, либо разместить их вокруг %INPUT%
в ваших условных операторах. Я бы порекомендовал последнее, потому что таким образом вы избегаете по крайней мере некоторых символов, имеющих особое значение в пакетных сценариях (если пользователю удалось ввести их). Итак, это то, что вы должны получить:
If "%INPUT%"=="y" goto yes
If "%INPUT%"=="n" goto no
If "%INPUT%"=="Y" goto yes
If "%INPUT%"=="N" goto no
Кстати, вы могли бы уменьшить количество условий, применив переключатель /I
к оператору IF
, например:
If /I "%INPUT%"=="y" goto yes
If /I "%INPUT%"=="n" goto no
Переключатель /I
делает сравнения нечувствительными к регистру и поэтому вам не нужны отдельные проверки для строк в разных случаях.
Еще одна проблема заключается в том, что после выполнения команды режима разработки перескакивает другая команда, и поэтому, если пользователь соглашается запустить Java в режиме разработки, он запустит ее как в разработке режим и режим без разработки. Поэтому, возможно, вам нужно добавить что-то вроде этого к вашему 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
Наконец, чтобы решить проблему обработки некорректного ввода, вы можете просто добавить другую (безусловную) команду goto
сразу после условных операторов, перед меткой yes
, а именно goto Ask
, чтобы вернуться к началу вашего script, где отображается приглашение, и запрашивается вход, или вы могли бы добавить еще одну команду ECHO перед прыжком, объяснив, что вход был неправильным, примерно так:
@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
...
Примечание. Некоторые из упомянутых здесь проблем также были адресованы @xmjx в их ответе, которые я полностью подтверждаю.
Ответ 2
я просто делаю:
set /p input= yes or no
if %input%==yes echo you clicked yes
if %input%==no echo you clicked no
pause
Ответ 3
Вот рабочий пример:
@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
Ответ 4
Я улучшил командный файл с подсказкой да или нет. Если пользователь вводит любой символ, кроме y и n, он снова запрашивает у пользователя допустимый ввод. Меня устраивает.
@echo off
:ConfirmBox
set /P c= Are you sure want to contine (y/n)?
if /I "%c%" EQU "Y" (
goto :FnYes
) else if /I "%c%" EQU "N" (
goto :FnNo
) else (
goto :InValid
)
:FnYes
echo You have entered Y
goto :END
:FnNo
echo You have entered N
goto :END
:InValid
echo Invalid selection. Enter Y or N
goto :ConfirmBox
:END
pause
exit
/I if if условие будет проверять как строчные, так и прописные буквы.
Ответ 5
Я не знаю, на какой платформе вы это делаете, но я предполагаю Windows из-за расширения .bat.
Также у меня нет возможности проверить это, но похоже, что пакетный процессор пропускает строки If из-за некоторых ошибок, а затем выполняет команду с -dev.
Вы можете попробовать это, перемещая две цели перехода (:yes
и :no
) вместе с кодом. Если тогда выполняется строка без -dev, вы знаете, что строки If ошибочны.
Если да, проверьте, действительно ли ==
правильный способ сравнения в файлах .bat
.
Кроме того, судя по тому, как bash делает этот материал, %foo=="y"
может оценивать true, только если %foo
содержит кавычки. Так что, возможно, "%foo"=="y"
- это путь.
Ответ 6
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
Это код, который я использую регулярно. Я заметил в примерах в этом блоге, что используются цитаты. Если тестовая строка изменена для использования кавычек, тест недействителен.
if /I %AREYOUSURE% NEQ "Y" GOTO END
Я тестировал на XP, Vista, Win7 и Win8. Все сбой при использовании кавычек.
Ответ 7
В зависимости от версии Windows вы можете использовать опцию "Выбор", чтобы быть полезной. Насколько мне известно, он не поддерживается в большинстве, если не все версии x64.
Удобную подстановку под названием Choice.vbs вместе с примерами использования можно найти на SourceForge под названием Choice.zip
Ответ 8
Добавьте кавычки ("") вокруг% INPUT%, чтобы она выглядела так:
If "%INPUT%" == "y" goto yes
If "%INPUT%" == "n" goto no
If "%INPUT%" == "Y" goto yes
If "%INPUT%" == "N" goto no
Ответ 9
попробуйте это для сравнения
if "%INPUT%"=="y"...