如何在Windows批处理文件中创建一个“你确定吗”的提示框?

14 浏览
0 Comments

如何在Windows批处理文件中创建一个“你确定吗”的提示框?

我有一个批处理文件,可以自动将一堆文件从一个地方复制到另一个地方,然后再复制回来。唯一的问题是,尽管它对我很有帮助,但我经常意外选择了命令缓冲区中的该命令,从而大规模覆盖未提交的更改。

我需要在我的.bat文件中添加什么代码,才能使其输出"确定吗?",并要求我在运行剩余文件之前输入Y

如果输入的是Y以外的任何内容,它应该在那一行上退出执行。

当我调用exit时,它会关闭cmd.exe,这不是我想要的。

0
0 Comments

如何在Windows批处理文件中创建一个“你确定吗”的提示?

有人问如何在Windows批处理文件中创建一个“你确定吗”的提示。下面是一个解决方案:

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

需要注意的是,在提示之前添加一个额外的SET AREYOUSURE=N,以便在同一命令窗口中已经运行过脚本的情况下清除之前选择的选项。如果不添加这一行,将保留之前选择的默认选项。

setlocalendlocal语句应该会处理这个问题。在endlocal之后,%AREYOUSURE%将不存在。

这段代码只在启用命令扩展的情况下才有效,默认情况下Windows是启用命令扩展的,但没有明确指定。如果用户错误输入了"而不是nN或其他任何字符,代码会导致批处理文件处理过程退出。如果用户输入了其他字符串,批处理代码会执行完全不同的操作。因此,带有这样一个提示的批处理文件可能会被劫持。

SET /P AREYOUSURE=Are you sure (Y/[N])?这一行应该替换为SET /P AREYOUSURE=Are you sure Y/[N]? (不包含括号),因为括号会影响代码的执行。

希望这些解释能对你有所帮助。如果你对这些解释还不理解,你可以查看相关资源进一步了解。

0
0 Comments

在Windows批处理文件中,有时需要在执行某个操作前询问用户是否确定。一个常见的情况是在删除文件或文件夹之前询问用户是否确认删除。这种提示可以防止用户意外删除重要的数据。

解决这个问题的方法是使用CHOICE命令。CHOICE命令可以显示一个带有选项的提示信息,并等待用户按下相应的键。根据用户的选择,可以执行不同的操作。

下面是一个使用CHOICE命令的示例:

CHOICE /C YNC /M "按Y表示是,按N表示否,按C表示取消。"

在这个示例中,提示信息显示了三个选项:Y、N和C。用户可以按下这些键中的一个来做出选择。

需要注意的是,CHOICE命令是在1993年或1994年的MS-DOS 6版本中添加的,所以可能不适用于所有的实现。因此,在使用CHOICE命令之前,最好先检查一下系统是否支持该命令。

如果想要了解更多关于如何使用CHOICE命令的信息,可以参考这个网页:computerhope.com/issues/ch001674.htm。在这个网页中,有一个具体的示例,展示了如何在批处理文件中使用CHOICE命令。

总之,通过使用CHOICE命令,可以在Windows批处理文件中实现一个“您确定吗”的提示,以确保用户在执行某个操作之前进行确认。这可以防止用户意外执行某些操作,从而保护重要的数据。

0
0 Comments

如何在Windows批处理文件中创建一个"are you sure"提示框?

在Windows命令行中,有两个可用于用户提示的命令:

1. 使用set命令,选项/P在启用了命令扩展的所有Windows NT版本上都可用;

2. 使用choice.exe命令,在Windows Vista及更高版本的PC用户以及Windows Server 2003及更高版本的服务器上默认可用。

set是Windows命令处理器cmd.exe的内部命令。选项/P用于提示用户输入一个字符串,只有在启用了命令扩展的情况下才可用,默认情况下启用了命令扩展,否则几乎没有批处理文件能够正常工作。

choice.exe是一个单独的控制台应用程序(外部命令),位于%SystemRoot%\System32目录中。可以将Windows Server 2003中的choice.exe文件复制到Windows XP机器上的%SystemRoot%\System32目录中,以在Windows XP上使用它,就像许多在Windows XP上默认情况下不可用但在Windows Server 2003上默认可用的其他命令一样。

最佳实践是使用CHOICE而不是SET /P,原因如下:

1. CHOICE仅接受在选项/C(以及Ctrl+C和Ctrl+Break)之后指定的键(或从STDIN读取的字符),如果用户按下错误的键,它会发出错误提示音。

2. CHOICE不需要按下除可接受键之外的任何其他键。一旦按下可接受的键,CHOICE立即退出,而SET /P需要用户用RETURN或ENTER键完成输入。

3. 使用CHOICE可以定义默认选项和超时,在几秒钟后自动继续使用默认选项,而无需等待用户。

4. 从调用带有提示的批处理文件的另一个批处理文件中自动回答提示的输出更好,可以使用类似于echo Y | call PromptExample.bat的方式使用CHOICE。

5. 使用CHOICE更容易对用户的选择进行评估,因为CHOICE根据按下的键(字符)退出,并分配给ERRORLEVEL,下一个步骤可以轻松地进行评估。

6. 在SET /P命令行上使用的环境变量如果用户仅按下RETURN或ENTER键且在提示用户之前未定义,则不会被定义。使用SET /P命令行上的环境变量如果在提示用户之前已定义,并且用户仅按下RETURN或ENTER键,则保留其当前值。

7. 用户可以在使用SET /P进行提示时输入任何内容,包括后来导致批处理文件由于语法错误而退出的字符串,或者在编码不良的批处理文件中根本没有包含的命令的执行。需要一些努力来使SET /P免受错误用户输入的安全保护。

以下是使用首选的CHOICE和备选的SET /P的提示示例,choice.exe在使用的计算机上不可用(运行Windows):

off
setlocal EnableExtensions DisableDelayedExpansion
echo This is an example for prompting a user.
echo(
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice="
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & exit /B
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 not errorlevel 1 goto UseChoice
if errorlevel 2 exit /B
:Continue
echo So you are sure. Okay, let's go ...
rem More commands can be added here.
endlocal

该批处理文件使用命令扩展,这在使用命令解释器cmd.exe时不可用的Windows 95/98/ME上。批处理标签:UseSetPrompt下的第一行也可以写成:`set "UserChoice=N"`。在这种情况下,用户选择输入预定义为N,这意味着用户可以只按下RETURN或ENTER键(或Ctrl+C或Ctrl+Break键,然后按N)使用默认选项。

提示文本由批处理文件中的SET命令输出。因此,提示文本通常应以空格字符结尾。CHOICE命令会删除提示文本中的所有尾随普通空格和水平制表符,然后在提示文本中添加一个空格。因此,CHOICE命令的提示文本可以用空格结尾或不用空格结尾,在执行时显示的提示文本没有区别。

对用户提示的评估顺序也可以完全改变,如dialer建议的。以下是一个示例:

off
setlocal EnableExtensions DisableDelayedExpansion
echo This is an example for prompting a user.
echo(
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice="
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I not "!UserChoice!" == "Y" endlocal & exit /B
endlocal
goto Continue
:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]?"
if not errorlevel 2 if errorlevel 1 goto Continue
exit /B
:Continue
echo So you are sure. Okay, let's go ...
endlocal

这段代码的结果是,如果用户绝对按下了Y键,则继续执行批处理文件中的:Continue标签以下的处理。在所有其他情况下,执行N键的代码,导致批处理文件处理以该代码退出,而不管用户是否真的按下了该键,或者是否故意或错误地输入了其他内容,或者是否按下了Ctrl+C或Ctrl+Break键,并决定不终止由cmd输出的提示的批处理作业。

对于更多关于SET /P和CHOICE用于提示用户从选项列表中进行选择的详细信息,请参见How to stop Windows command interpreter from quitting batch file execution on an incorrect user input?

关于使用的命令以及它们的工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面:

- choice /?

- echo /?

- endlocal /?

- exit /?

- goto /?

- if /?

- set /?

- setlocal /?

此外,还有一些提示:

1. IF命令将比较比较运算符左右的两个字符串,包括双引号。因此,不是将UserChoice的值与N和Y进行大小写比较,而是将UserChoice的值用双引号括起来与"N"和"Y"进行大小写比较。

2. IF比较运算符EQU和NEQ主要用于比较范围在-2147483648到2147483647之间的两个整数,而不是用于比较两个字符串。EQU和NEQ也可用于字符串比较,但会尝试将左字符串转换为整数后再进行比较,这是多余的。对于字符串比较,比较运算符是==和not ... ==,即使在禁用了命令扩展的情况下,它们也可以使用。有关IF比较运算符的更多详细信息,请参见Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files

3. 命令goto :EOF需要启用命令扩展才能真正退出批处理文件处理。有关详细信息,请参见Where does GOTO :EOF return to?。也可以使用exit /B,它即使在禁用了命令扩展的情况下也能正常工作,但在禁用了命令扩展时会输出错误消息。可以在任何执行环境中使用exit /B来退出批处理文件的处理,而不会显示任何错误消息。在示例中使用exit /B,因为它比goto :EOF更短。这两个命令在示例中都能正常工作,因为执行环境在批处理文件的前两行命令中完全定义。

请参考以下资源获取有关具体命令和它们的更多详细信息:

- This answer,了解关于SETLOCAL和ENDLOCAL命令的更多细节。

- Why is no string output with 'echo %var%' after using 'set var = text' on command line?,解释将字符串赋给环境变量时使用语法set "variable=value"的原因。

- Single line with multiple commands using Windows batch file,了解if errorlevel X的行为和运算符&的用法。

- using command redirection operators,解释了重定向运算符|和处理STDIN。

- Windows Environment Variables,解释了SystemRoot的含义。

- DosTips forum topic,关于ECHO. FAILS to give text or blank line的讨论。

0