Как заставить командный файл запрашивать ввод пользователя?

Я пытаюсь создать игру на основе пакетных файлов и хочу иметь возможность собирать вводимые пользователем данные. Это должно быть немного похоже на команду паузы, но требует ввода данных от пользователя.

У меня пока не так много кода, потому что это начало программы, но вот что у меня есть на данный момент:

@echo off
echo Start the game? [Y/N]

Вот как должен выглядеть результат:

Start the game? [Y/N]
y

Кто-нибудь знает, что я могу сделать, чтобы решить эту проблему?

Первый результат поиска по сайту: stackoverflow.com/questions/1223721/…

Squashman 12.07.2024 00:17

Но для простого ввода Да/Нет или ввода одной буквы лучше использовать команду choice. Откройте командную строку и введите: choice /?, чтобы прочитать справку.

Squashman 12.07.2024 00:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для простого выбора «да/нет» используйте 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 12.07.2024 02:06

@SomethingDark хороший вопрос. Не имею представления! Вероятно, я скопировал его из какого-то примера много лет назад и с тех пор без вопросов копирую повсюду. Посмотрим, смогу ли я выяснить, откуда оно взялось и почему.

Clifford 12.07.2024 08:25

@SomethingDark - Нет, не могу найти. Немного "карго-культ" с моей стороны, дублирую что-то бесполезное, не понимая зачем. Если вспомню откуда это взялось, обновлю, а пока удалю.

Clifford 12.07.2024 08:42

аргументация, вероятно, будет заключаться в том, что «определенно пустая переменная (поскольку вы не можете определить имя переменной с помощью =), чтобы сделать конечный пробел очевидным» - где кавычки работают гораздо лучше (поскольку после %=% могут быть пробелы, которые вы не делаете Не так-то просто заметить; Возможные пробелы после закрывающей кавычки не повредят, поскольку они перестанут быть частью значения — пробелы после %=% будут.

Stephan 12.07.2024 09:29

Я думаю, что это очень специфично для сценария, из которого я его скопировал, и который был написан давным-давно.

Clifford 12.07.2024 14:54

Другие вопросы по теме