如何在Windows批处理文件中创建"是否确定"提示?

Jos*_*off 81 windows cmd batch-file

我有一个批处理文件,可以自动将一堆文件从一个地方复制到另一个地方,然后返回给我.唯一的事情就是它帮助我,我不小心选择了命令缓冲区中的命令,并大量覆盖未经修改的更改.

我的.bat文件需要什么代码才能让它说"你确定",并让我在运行文件的其余部分之前输入"y"吗?如果输入"y"之外的任何内容,它应该退出该行的执行.

编辑 11月27日好的我再次标记这个未答复,因为我仍然无法弄明白.当我打电话给"退出"时 它关闭cmd.exe这不是我想要的.这一切都是因为Windows实现了命令缓冲区错误[不同于我至少习惯的]

Joe*_*Joe 143

你想要的东西:

@echo off
setlocal
:PROMPT
SET /P AREYOUSURE=Are you sure (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END

echo ... rest of file ...


:END
endlocal
Run Code Online (Sandbox Code Playgroud)

  • 我唯一要添加的是提示之前的另一个`SET AREYOUSURE = N`,以便清除选择(如果您之前已经在该命令窗口中运行过该脚本)。没有它,默认值将保留先前选择的选项。 (5认同)
  • @Igal我很确定`setlocal`和`endlocal`应该照顾它.在`endlocal`之后,'%AREYOUSURE%`将不再存在. (4认同)
  • ...使用一些关于“重要的两行**”的解释性文字会更有价值。 (2认同)

Ste*_*owe 27

尝试CHOICE命令,例如

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
Run Code Online (Sandbox Code Playgroud)

  • <show off>虽然这是相对较新的.它是在1993年或1994年的MS-DOS 6中添加的,因此它可能不适用于所有实现</ show off> (6认同)
  • 如何在这里实际使用选择的例子http://www.computerhope.com/issues/ch001674.htm (3认同)
  • 我在Windows 8上试过它,我可以确认它有效. (2认同)

gho*_*g74 14

choice命令无处不在.对于较新的Windows版本,该set命令具有/p可以获得用户输入的选项

SET /P variable=[promptString]
Run Code Online (Sandbox Code Playgroud)

了解set /?更多信息


小智 7

这里简单一点:

@echo off
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ...
if not %var%== Y exit
Run Code Online (Sandbox Code Playgroud)

或者

@echo off
echo Are You Sure?[Y/N]
choice /c YN
if %errorlevel%==1 goto yes
if %errorlevel%==2 goto no
:yes
echo yes
goto :EOF
:no
echo no
Run Code Online (Sandbox Code Playgroud)


Mof*_*ofi 7

Windows命令行上有两个命令可用于用户提示:

  • 设置选项/P在所有启用了命令扩展名的Windows NT版本上都可用,并且
  • 在Windows Vista和Windows更高版本(对于PC用户)以及Windows Server 2003和Windows更高版本的服务器上,默认情况下可以使用choice.exe

set是Windows命令处理器的内部命令cmd.exe。该选项/P为一个字符串提示用户是仅与默认情况下启用否则几乎没有批处理文件将继续工作,如今已启用的命令扩展。

choice.exe是位于中的独立控制台应用程序(外部命令)%SystemRoot%\System32choice.exe可以将Windows Server 2003的Windows Server 2003复制到%SystemRoot%\System32Windows XP计算机上的目录中,以便在Windows XP上使用,就像许多其他命令在Windows XP上默认不可用,但在Windows Server 2003上默认可用。

由于以下原因,最好的选择是使用CHOICE而不是SET / P。

  1. CHOICE仅接受在选项(和)之后指定的键(分别从STDIN读取的字符),并且如果用户按下了错误的键,则输出错误的提示音。/CCtrl+C
  2. 除可接受的键之一外,CHOICE不需要按下任何其他键。在SET / P要求用户使用或完成输入时,一旦按下可接受的键,则CHOICE立即退出。RETURNENTER
  3. 这是可能的CHOICE定义默认选项和超时默认选项自动继续在几秒钟后无需等待用户。
  4. 输出更好地是从另一个批处理文件自动应答提示,该批处理文件使用类似于CHOICE的方式echo Y | call PromptExample.bat使用提示调用批处理文件。
  5. 使用CHOICE可以更轻松地评估用户的选择,因为CHOICE退出时会根据按下的键(字符)分配一个值,该值分配给ERRORLEVEL,然后可以轻松对其进行评估。
  6. 如果用户只是按下键,或者未在提示用户之前定义它,则未定义SET / P上使用的环境变量。如果在之前定义并且用户按下just 或,则SET / P命令行上使用的环境变量将保留其当前值。RETURNENTERRETURNENTER
  7. 用户可以自由输入带有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 ...
Run Code Online (Sandbox Code Playgroud)

注意:此批处理文件使用的命令扩展名在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 / PCHOICE提示用户从选项列表中进行选择的更多详细信息,请参阅有关如何停止Windows命令解释器退出不正确的用户输入的批处理文件的答案

更多提示:

  1. IF比较包含双引号的比较运算符左右两个字符串。因此,不区分大小写的比较不是UserChoicewith NY的值,而是with 和UserChoice包围的值。""N""Y"
  2. 所述IF比较运算符EQUNEQ被用于在范围-2147483648比较两个整数2147483647,而不是为了比较两个字符串设计初级。EQU并且NEQ还可以用于字符串比较,但是在无用的尝试将左字符串转换为整数的情况下,使用双引号比较字符串会产生结果。EQU并且NEQ只能与启用的命令扩展一起使用。用于字符串比较的比较运算符是==not ... ==即使在禁用的命令扩展名下也可以使用command.com,因为MS-DOS和Windows 95/98 / ME已经支持它们。有关IF比较运算符的更多详细信息,请参阅Windows批处理文件中的NEQ,LSS,GTR等符号
  3. 该命令goto :EOF需要启用的命令扩展名才能真正退出批处理文件处理。有关更多详细信息,请参见GOTO:EOF返回何处?

为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • choice /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

也可以看看:


归档时间:

查看次数:

96880 次

最近记录:

6 年,6 月 前