Я пытаюсь создать игру на основе пакетных файлов и хочу иметь возможность собирать вводимые пользователем данные. Это должно быть немного похоже на команду паузы, но требует ввода данных от пользователя.
У меня пока не так много кода, потому что это начало программы, но вот что у меня есть на данный момент:
@echo off
echo Start the game? [Y/N]
Вот как должен выглядеть результат:
Start the game? [Y/N]
y
Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему?
Первый результат поиска по сайту: stackoverflow.com/questions/1223721/…
Но для простого ввода Да/Нет или ввода одной буквы лучше использовать команду choice
. Откройте командную строку и введите: choice /?
, чтобы прочитать справку.
Для простого выбора «да/нет» используйте choice
, затем проверьте errorlevel
— например:
choice /N /M "Start the game? [Y/N] "
if %errorlevel%==1 goto start else goto end
:start
:: Do something here
:end
:: Finish here
Запустите choice /?
, чтобы увидеть дополнительные опции. Обратите внимание, что choice
отображает параметры, а ?
автоматически выглядит следующим образом:
Start the game [Y,N]?
Чтобы получить именно тот текст, который вы предложили, подавите параметры и поместите их в подсказку:
choice /N /M "Start the game? [Y/N] "
Для более сложного пользовательского ввода вы можете установить переменную среды из предложенного пользовательского ввода, используя синтаксис:
set /P <environment variable name>=<prompt>
затем вы проверяете строку переменной среды так, как вам нужно.
Например, хотя это излишне для односимвольных записей y/n, где choice
— более простой вариант:
@echo off
:: Get input
:input_start_yn
set /P ANSWER=Start the game? [Y/N] %=%
if "%ANSWER%"= = "Y" goto start
if "%ANSWER%"= = "y" goto start
if "%ANSWER%"= = "N" goto end
if "%ANSWER%"= = "n" goto end
goto input_start_yn
:start
:: Do something here
:end
:: Finish here
Решение с переменной среды имеет то преимущество, что сохраняет вводимые пользователем данные на постоянной основе, тогда как errorlevel
является временным и будет перезаписан последующими командами. Он также позволяет вводить строки, а не отдельные символы, поэтому его можно использовать для более сложного ввода.
Просто из любопытства, почему set /P <environment variable name>=<prompt> %=%
, а не более стандартный set /P "<environment variable name>=<prompt> "
?
@SomethingDark хороший вопрос. Не имею представления! Вероятно, я скопировал его из какого-то примера много лет назад и с тех пор без вопросов копирую повсюду. Посмотрим, смогу ли я выяснить, откуда оно взялось и почему.
@SomethingDark - Нет, не могу найти. Немного "карго-культ" с моей стороны, дублирую что-то бесполезное, не понимая зачем. Если вспомню откуда это взялось, обновлю, а пока удалю.
аргументация, вероятно, будет заключаться в том, что «определенно пустая переменная (поскольку вы не можете определить имя переменной с помощью =
), чтобы сделать конечный пробел очевидным» - где кавычки работают гораздо лучше (поскольку после %=%
могут быть пробелы, которые вы не делаете Не так-то просто заметить; Возможные пробелы после закрывающей кавычки не повредят, поскольку они перестанут быть частью значения — пробелы после %=%
будут.
Я думаю, что это очень специфично для сценария, из которого я его скопировал, и который был написан давным-давно.