如何在 Windows 批处理文件中创建“ Are you sure”提示符?

我有一个批处理文件,自动复制一堆文件从一个地方到另一个地方,并为我返回。唯一能帮助我的是,我不断地从命令缓冲区中意外地选择那个命令,并且大量地覆盖未提交的更改。

我需要什么代码。Bat 文件使其输出“ 你确定吗?”,并让我输入 Y之前,它运行的文件的其余部分?

如果键入了 Y以外的任何内容,那么它应该退出该行的执行。

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

177063 次浏览

试试 选择命令

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."

choice命令并非在所有地方都可用。对于较新的 Windows 版本,set命令有 /p选项,您可以获得用户输入

SET /P variable=[promptString]

更多信息见 set /?

你想要这样的东西:

@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

这里稍微简单一点:

@echo off
set /p var=Are You Sure?[Y/N]:
if %var%== Y goto ...
if not %var%== Y exit

或者

@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

如果希望批处理程序退出到提示符,而不关闭提示符(A.K.A cmd.exe) ,可以使用“ exit/b”。

这个可能会有帮助。

set /p _sure="Are you sure?"
::The underscore is used to ensure that "sure" is not an enviroment
::varible
if /I NOT "_sure"=="y" (
::the /I makes it so you can
exit /b
) else (
::Any other modifications...
)

或者如果你不想用那么多台词..。

Set /p _sure="Are you sure?"
if /I NOT "_sure"=="y" exit /b
::Any other modifications and commands.

希望这个能帮上忙。

下面是一个简单的例子,我在备份(。Bat/batch)脚本,它允许我在进行备份时有不同的选项。

...


:choice
set /P c=Do you want to rsync the archives to someHost[Y/N]?
if /I "%c%" EQU "Y" goto :syncthefiles
if /I "%c%" EQU "N" goto :doonotsyncthefiles
goto :choice


:syncthefiles
echo rsync files to somewhere ...
bash -c "rsync -vaz /mnt/d/Archive/Backup/ user@host:/home/user/Backup/blabla/"
echo done


:doonotsyncthefiles
echo Backup Complete!


...

这些积木你想要多少就有多少。

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

  • set with option /P available on all Windows NT versions with enabled command extensions and
  • Exe 默认情况下可以在 Windows Vista 和更高版本的 Windows 上使用,也可以在 Windows Server 2003和更高版本的 Windows 服务器上使用。

Set 是 Windows 命令处理器 cmd.exe的内部命令。提示用户输入字符串的选项 /P只能在启用了命令扩展名的情况下使用,这些命令扩展名在默认情况下是启用的,否则现在几乎没有批处理文件可用。

Exe 是位于 %SystemRoot%\System32中的一个单独的控制台应用(外部命令)。WindowsServer2003的文件 choice.exe可以复制到 WindowsXP 机器上的目录 %SystemRoot%\System32中,以便在 WindowsXP 上使用,就像许多其他命令一样,这些命令默认情况下不能在 WindowsXP 上使用,但默认情况下可以在 WindowsServer2003上使用。

It is best practice to favor usage of 选择 over usage of SET/P because of the following reasons:

  1. CHOICE 只接受选项 /C(以及 Ctrl+CCtrl+Break)之后指定的键(分别从 STDIN读取的字符) ,如果用户按错键,则输出错误提示音。
  2. CHOICE 不需要按任何其他键,只需按一个可接受的键即可。按下可接受的键后,CHOICE立即退出,而 SET /P要求用户用 RETURNENTER完成输入。
  3. 使用 选择可以定义一个默认选项和一个超时,以便在几秒钟后自动继续使用默认选项,而无需等待用户。
  4. 在另一个批处理文件自动响应提示时,输出效果更好,该批处理文件使用类似 echo Y | call PromptExample.bat的命令调用批处理文件,而使用 选择时则使用类似 echo Y | call PromptExample.bat的命令。
  5. 使用 选择对用户的选择进行评估要容易得多,因为 选择根据按下的键(字符)给出一个值,这个值分配给 错误级别,接下来可以很容易地对其进行评估。
  6. 如果用户只按下 RETURN或者 ENTER键,那么就没有定义环境变量,而且在提示用户之前也没有定义。在 SET/P命令行上使用的环境变量保持其当前值(如果在之前定义的话) ,用户只需按 RETURN或者 ENTER
  7. 用户可以自由输入 SET/P提示的任何内容,包括一个字符串,后来由于语法错误导致 cmd退出批处理文件的执行,或者执行根本不包含在编码不好的批处理文件的批处理文件中的命令。它需要一些努力来使 SET/P安全地防止错误或故意错误的用户输入。

下面是一个使用首选 选择choice.exe上的 SET/P的提示示例,在运行 Windows 的用过的计算机上不可用。

@echo 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 & 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 not errorlevel 1 goto UseChoice
if errorlevel 2 goto :EOF


:Continue
echo So you are sure. Okay, let's go ...
rem More commands can be added here.
endlocal

注意: 这个批处理文件使用的命令扩展名在 Windows 95/98/ME 上不可用,它使用 command.com而不是 cmd.exe作为命令解释器。

添加命令行 set "UserChoice=!UserChoice: =!"是为了在 Windows NT4/2000/XP 上使用 echo Y | call PromptExample.bat调用这个批处理文件,而不需要使用 echo Y| call PromptExample.bat。在运行两个字符串比较之前,它从从 STDIN读取的字符串中删除所有空格。

echo Y | call PromptExample.bat导致 为什么SPACE被分配到环境变量 UserChoice。这将导致在处理提示两次,因为 "Y "既不是大小写不敏感的等于 "N",也不是 "Y"而不删除首先所有的空格。因此,UserChoice为什么SPACE作为值将导致第二次运行提示符,选项 N在第二次提示符执行时被定义为批处理文件中的默认值,这将导致批处理文件处理意外退出。是的,安全使用 UserChoice1是非常棘手的,不是吗?

如果用户按 Ctrl+CCtrl+Breakchoice.exe退出 0,并接下来回答 cmd.exe输出的问题,以终止 N为 NO 的批处理作业。由于这个原因,添加了条件 if not errorlevel 1 goto UserChoice,以便用 YN批处理文件代码再次提示用户在提示中获得确切的答案。感谢 拨号器提供关于这个可能的特殊用例的信息。

批量标签 :UseSetPrompt下面的第一行也可以写成:

set "UserChoice=N"

在这种情况下,用户选择输入是用 N预定义的,这意味着用户可以只按 RETURNENTER(或 Ctrl+CCtrl+Break和下一个 N)来使用默认选择。

命令 预备按照批处理文件中的内容输出提示文本。因此,提示文本通常以空格结束。命令 选择从提示文本中删除所有跟随的普通空格和水平选项卡,然后向提示文本中添加一个空格。因此,命令 选择的提示文本可以不使用空格或在末尾使用空格编写。这对执行时显示的提示文本没有影响。

用户提示评价的顺序也可以根据 拨号器的建议完全改变。

@echo 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 & goto :EOF
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
goto :EOF


:Continue
echo So you are sure. Okay, let's go ...
endlocal

This code results in continuation of batch file processing below the batch label :Continue if the user pressed definitely key Y. In all other cases the code for N is executed resulting in an exit of batch file processing with this code independent on user pressed really that key, or entered something different intentionally or by mistake, or pressed Ctrl+C or Ctrl+Break and decided next on prompt output by cmd not terminating the batch job.

有关使用 SET/PCHOICE提示用户从选项列表中进行选择的更多详细信息,请参阅 如何停止 Windows 命令解释器退出对不正确的用户输入的批处理文件执行?上的答案

更多提示:

  1. IF 将比较运算符的左右两个字符串与双引号 包括进行比较。因此,UserChoiceNY之间的大小写不敏感性比较不是 UserChoiceNY之间的值,而是 ""N""Y"之间的 UserChoice"Y"之间的值。
  2. 如果比较运算符 EQUNEQ主要用于比较范围为 -2147483648至2147483647的两个整数,而不用于比较两个字符串。EQUNEQ也可以进行字符串比较,但是在无效地尝试将左边的字符串转换为整数之后,会导致用双引号比较字符串。EQUNEQ只能在启用了命令扩展插件的情况下使用。字符串比较的比较操作符是 ==not ... ==,它们甚至可以在禁用的命令扩展中工作,因为即使是 MS-DOS 和 Windows 95/98/ME 的 command.com也支持它们。有关 如果比较运算符的详细信息,请参阅 NEQ1。
  3. 命令 goto :EOF需要启用命令扩展才能真正退出批处理文件处理

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

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

参见:

下面是 是/否答案的常用方法。

也不区分大小写。

这只是检查输入给出的错误,并将 choice变量设置为您需要的任何值,以便在下面的代码中使用它。

@echo off
choice /M "[Opt 1]  Do you want to continue [Yes/No]"
if errorlevel 255 (
echo Error
) else if errorlevel 2 (
set "YourChoice=will not"
) else if errorlevel 1 (
set "YourChoice=will"
) else if errorlevel 0 (
goto :EOF
)
echo %YourChoice%
pause

首先,打开终端。

然后,打字

cd ~
touch .sure
chmod 700 .sure

接下来,打开。当然,并粘贴到里面。

#!/bin/bash --init-file
PS1='> '
alias y='
$1
exit
'
alias n='Taskkill /IM %Terminal% /f'
echo ''
echo 'Are you sure? Answer y or n.'
echo ''

After that, close the file.

~/.sure ; ENTER COMMAND HERE

This will give you a prompt of are you sure before continuing the command.

打开终端。键入以下内容

echo>sure.sh
chmod 700 sure.sh

把这个粘贴进去

#!\bin\bash


echo -n 'Are you sure? [Y/n] '
read yn


if [ "$yn" = "n" ]; then
exit 1
fi


exit 0

关闭 sure.sh 并在终端中键入这个命令。

alias sure='~/sure&&'

现在,如果在输入命令之前输入 sure,它会在继续执行命令之前给出一个 are you sure 提示符。

希望这对你有帮助!

You can consider using a UI confirmation.

yesnopopup.bat

@echo off


for /f "tokens=* delims=" %%# in ('yesnopopup.bat') do (
set "result=%%#"
)


if /i result==no (
echo user rejected the script
exit /b 1
)


echo continue


rem --- other commands --

用户将看到以下内容,根据选择,脚本将继续:

enter image description here

使用完全相同的脚本,你也可以使用 iexpYNbutton.bat,这将产生类似的弹出窗口。

使用 纽扣,蝙蝠,您可以尝试以下脚本:

@echo off


for /f "tokens=* delims=" %%# in ('buttons.bat "Yep!" "Nope!" ') do (
set "result=%%#"
)


if /i result==2 (
echo user rejected the script
exit /b 1
)


echo continue


rem --- other commands --

用户将看到:

enter image description here

你也可以使用‘ Choice’命令

@echo off
echo Sure?


CHOICE /C YN


IF %ERRORLEVEL% EQU 1 goto CONTINUE
IF %ERRORLEVEL% EQU 2 goto END


:END
exit


:CONTINUE
echo hi
pause

我会用下面的方法来确保测试和变量在循环等过程中是正确的。

:: rem at the top of the script
setlocal enabledelayedexpansion


:: choice example
CHOICE /C YNC /M "Continue? Press Y for Yes, N for No or C for Cancel."
If /I "[!errorlevel!]" NEQ "[1]" ( GOTO START_OVER )

答案有很多,但似乎没有一个是简单直接的。这是我正在使用的代码:

choice /M "Do you want to continue?"


if %errorlevel% EQU 1 (
... run your code lines here
)