为什么这个批处理文件 "remember" 用户输入?

Why does this batch file "remember" user input?

我一直在编写一个批处理文件,它使用 Chocolatey 包管理器将软件安装到电脑上。我以一种让用户可以选择安装每个软件的方式编写它。 默认情况下,如果在没有用户输入的情况下按下回车键,则每个包问题都应使用 N 作为输入。 这应该跳过该步骤并转到下一步。

我的问题是,如果我按 y 接受其中一个包,然后在不键入任何内容的情况下在下一个包上按 enter,而不是默认为 N,它会保留上一个请求中的 y。

示例:

您要安装软件 1 吗?(y/N)[return]
跳过软件

您要安装软件 2 吗?(y/N) y
正在安装软件 2

您要安装软件 3 吗?(y/N)[return]
正在安装软件 3

它似乎一直在记忆中按下最后一个键。有没有办法清除最后按下的键?或其他一些修复。 如果我在不按任何字母键的情况下完成整个过程并且只按 return 它会跳过所有内容。但是,如果我在每个问题之后都按一​​次 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" 替换了它的所有实例,所以它工作正常!不能 select 最佳答案,因为答案在评论中。

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