Защо този пакетен файл запомня въведеното от потребителя?

Пишех пакетен файл, който използва мениджъра на пакети Chocolatey за инсталиране на софтуер на компютър. Написах го по начин, който дава на потребителя избор за инсталиране на всяка част от софтуера. По подразбиране всеки въпрос на пакет трябва да използва N като вход, ако клавишът за въвеждане е натиснат без потребителско въвеждане. Това трябва да пропусне стъпката и да премине към следващата.

Проблемът ми е, че ако натисна y, за да приема един от пакетите, но след това натисна enter на следващия пакет, без да въвеждам нищо, вместо да е по подразбиране N, той запазва y от предишната заявка.

Пример:

Искате ли да инсталирате софтуер 1? (да/не) [връщане]
Пропускане на софтуер

Искате ли да инсталирате софтуер 2? (y/N) 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 /p c=" е начин за задаване на постоянна променлива, а не задаване на въпрос за потребителско въвеждане (което беше примерът, който някой ми даде), така че аз Сега смених всички екземпляри на това с "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