Windows命令行上有两个命令可用于用户提示:
- 设置选项
/P
在所有启用了命令扩展名的Windows NT版本上都可用,并且
- choice.exe在Windows Vista和Windows更高版本(对于PC用户)以及Windows Server 2003和Windows更高版本的服务器上默认可用。
set是Windows命令处理器的内部命令cmd.exe
。该选项/P
为一个字符串提示用户是仅与默认情况下启用否则几乎没有批处理文件将继续工作,如今已启用的命令扩展。
choice.exe是位于中的独立控制台应用程序(外部命令)%SystemRoot%\System32
。choice.exe
可以将Windows Server 2003的Windows Server 2003复制到%SystemRoot%\System32
Windows XP计算机上的目录中,以便在Windows XP上使用,就像许多其他命令在Windows XP上默认不可用,但在Windows Server 2003上默认可用。
由于以下原因,最好的选择是使用CHOICE而不是SET / P。
- CHOICE仅接受在选项(和)之后指定的键(分别从STDIN读取的字符),并且如果用户按下了错误的键,则输出错误蜂鸣声。
/C
Ctrl+C
- 除可接受的键之一外,CHOICE不需要按下任何其他键。在SET / P要求用户使用或完成输入时,一旦按下可接受的键,则CHOICE立即退出。RETURNENTER
- 这是可能的CHOICE定义默认选项和超时默认选项自动继续在几秒钟后无需等待用户。
- 输出更好地是从另一个批处理文件自动应答提示,该批处理文件使用类似于
echo Y | call PromptExample.bat
使用CHOICE的方式通过提示调用批处理文件。
- 使用CHOICE可以更轻松地评估用户的选择,因为CHOICE退出时会根据按下的键(字符)分配一个值,该值被分配给ERRORLEVEL,然后可以轻松对其进行评估。
- 如果用户仅按下键或在提示用户之前未定义SET / P上使用的环境变量,则未定义。如果在之前定义并且用户按下just 或,则SET / P命令行上使用的环境变量将保留其当前值。RETURNENTERRETURNENTER
- 用户可以自由输入任何带有SET / P提示的内容,包括一个字符串,该字符串随后
cmd
由于语法错误而导致退出批处理文件执行,或者执行不包含在批处理文件中的命令编码良好的批处理文件。需要采取一些措施来确保SET / P安全,以防止错误或故意输入错误的用户输入。
这是一个提示示例,其中使用首选的CHOICE,或者在运行Windows的二手计算机上不可用的情况下,设置SET / P。choice.exe
@echo off
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=N"
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & goto :EOF
if /I not "!UserChoice!" == "Y" goto UseSetPrompt
endlocal
goto Continue
:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]? "
if errorlevel 2 goto :EOF
:Continue
echo So your are sure. Okay, let's go ...
注意:此批处理文件使用的命令扩展名在Windows 95/98 / ME上不可用,command.com
而不是cmd.exe
用作命令解释器。
set "UserChoice=!UserChoice: =!"
添加了命令行,以便可以echo Y | call PromptExample.bat
在Windows NT4 / 2000 / XP上调用此批处理文件,并且不需要使用echo Y| call PromptExample.bat
。在运行两次字符串比较之前,它将删除从STDIN读取的字符串中的所有空格。
echo Y | call PromptExample.bat
导致YSPACE被分配给环境变量UserChoice
。这将导致两次处理提示,因为"Y "
既不区分大小写"N"
也不等于"Y"
不删除所有空格。因此UserChoice
,将Y设置SPACE为值将导致第二次运行提示N
,并在第二次执行提示时在批处理文件中将其定义为默认选项,这将导致意外退出批处理文件。是的,安全使用SET / P确实很棘手,不是吗?
有关使用SET / P和CHOICE提示用户从选项列表中进行选择的更多详细信息,请参见有关如何停止Windows命令解释器退出不正确的用户输入的批处理文件的答案?
更多提示:
- IF比较包含双引号的比较运算符左右两个字符串。因此,不区分大小写的比较不是
UserChoice
with N
和Y
的值,而是with 和UserChoice
包围的值。"
"N"
"Y"
- 所述IF比较运算符
EQU
和NEQ
被用于在范围-2147483648比较两个整数2147483647,而不是为了比较两个字符串设计初级。EQU
并且NEQ
还可以用于字符串比较,但是会在无用的尝试将左字符串转换为整数时比较双引号中的字符串。EQU
并且NEQ
只能与启用的命令扩展一起使用。用于字符串比较的比较运算符是==
,not ... ==
即使command.com
在MS-DOS和Windows 95/98 / ME 都已支持它们的情况下,它们也可以与禁用的命令扩展一起使用。有关IF比较运算符的更多详细信息,请参阅Windows批处理文件中的NEQ,LSS,GTR等符号。
- 该命令
goto :EOF
需要启用的命令扩展名才能真正退出批处理文件处理。有关更多详细信息,请参见GOTO:EOF返回何处?
为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
也可以看看:
SET AREYOUSURE=N
在提示符之前添加一个命令,以清除选择(如果您之前已经在该命令窗口中运行过该脚本)。没有它,默认值将保留先前选择的选项。