为什么这个批处理文件 "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
我一直在编写一个批处理文件,它使用 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