Почему этот командный файл запоминает ввод пользователя?

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

Моя проблема в том, что если я нажимаю y, чтобы принять один из пакетов, но затем нажимаю ввод для следующего пакета, ничего не вводя, вместо того, чтобы по умолчанию использовать N, он сохраняет y из предыдущего запроса.

Пример:

Вы хотите установить программное обеспечение 1?(да/нет) [возврат]
Пропуск программного обеспечения

Вы хотите установить программное обеспечение 2?(да/нет) y
Установка программного обеспечения 2

Хотите установить программное обеспечение 3?(да/нет) [возврат]
Установка программного обеспечения 3

Кажется, что последняя клавиша нажата в памяти. Есть ли способ очистить последнюю нажатую клавишу? или другое исправление. Если я пройду весь процесс, не нажимая никаких буквенных клавиш, а только нажму «Ввод», он все пропустит. Но если я нажму y хотя бы один раз, каждый последующий вопрос y также будет принят.

Предварительный просмотр кода ниже:

:choose_mbam
ECHO.
SET /P c=Would you like to install malwarebytes anti-virus?(y/N)
IF /I "%c%" EQU "Y" ( 
  GOTO :install_mbam
) ELSE IF /I "%c%" EQU "N" ( 
  GOTO :choose_plugins 
) ELSE ( 
  GOTO :choose_plugins
)

:install_mbam
ECHO Installing Malwarebytes
powershell -command "& cinst malwarebytes -y">NUL || ECHO Malwarebytes already installed and up to date.
GOTO :choose_plugins

:choose_plugins
ECHO.
set /P c=Would you like to update your plugins eg.flash, silverlight, java?(y/N)
if /I "%c%" EQU "Y" ( 
  goto :install_plugins
) ELSE IF /I "%c%" EQU "N" ( 
  goto :choose_browser
) ELSE ( 
  GOTO :choose_browser 
)

:install_plugins
ECHO Installing Silverlight
powershell -command "& cinst silverlight -y">NUL
ECHO.
ECHO Installing Flash
powershell -command "& cinst flashplayerplugin -y">NUL
ECHO.
ECHO Installing Java
powershell -command "& cinst jre8 -y">NUL
ECHO.
ECHO Installing .Net 4.5
powershell -command "& cinst dotnet4.5.1 -y">NUL
GOTO :choose_browser

:choose_browser
...

РЕДАКТИРОВАТЬ: Ответ был показан мне Стефаном в комментариях. Как я уже сказал, я не понимал, что "set /pc=" был способом установки постоянной переменной, а не задавал вопрос для пользовательского ввода (что было сделано в примере, который кто-то дал мне), поэтому я теперь заменил все экземпляры этого на «ECHO», так что все работает нормально! Не могу выбрать лучший ответ, так как ответ был в комментарии.


person Bill Proxima Chandler    schedule 13.11.2015    source источник
comment
вы вообще не установили значение по умолчанию. Откуда ему знать? (set /p сохраняет предыдущее значение, если ввод пуст, поэтому установите значение по умолчанию непосредственно перед set /p)   -  person Stephan    schedule 13.11.2015
comment
Пожалуйста, напишите ответ с рабочим примером, чтобы всем было понятно. Спасибо.   -  person Stoleg    schedule 13.11.2015
comment
Вам просто нужно поставить set c= перед каждым set /P c=..., чтобы переменная c очищалась...   -  person aschipfl    schedule 13.11.2015


Ответы (1)


set /p оставляет значение переменной без изменений, если пользователь просто нажимает ENTER. Вы можете использовать это поведение, чтобы предварительно определить значение по умолчанию, прежде чем спрашивать пользователя:

set c=N
SET /P c=Question?(y/N) 

Если вам не нужно значение по умолчанию, установите значение по умолчанию на ничего:

set "c="
SET /P c=Question?(y/n) 
if not defined c echo no Input given
person Stephan    schedule 13.11.2015