为什么此批处理文件“记住”用户输入?

时间:2015-11-13 12:32:46

标签: batch-file user-input chocolatey

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

我的问题是,如果我按y接受其中一个软件包,然后在下一个软件包上按Enter键而不输入任何内容,而不是默认为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”替换了所有实例,所以它工作正常!无法选择最佳答案,因为答案在评论中。

1 个答案:

答案 0 :(得分:4)

如果用户只按ENTER键,

set /p会保持变量的值不变。在询问用户之前,您可以使用此行为预定义默认值:

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