我一直在编写一个批处理文件,它使用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”替换了所有实例,所以它工作正常!无法选择最佳答案,因为答案在评论中。
答案 0 :(得分:4)
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