如何在Windows批处理文件中生成“是否确定”提示?

时间:2009-11-25 04:08:46

标签: windows batch-file cmd

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

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

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

12 个答案:

答案 0 :(得分:132)

你想要这样的东西:

@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

答案 1 :(得分:25)

尝试CHOICE command,例如

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

答案 2 :(得分:12)

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

SET /P variable=[promptString]

请参阅set /?了解详情

答案 3 :(得分:3)

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

  • set和选项/P在所有启用了命令扩展
  • 的Windows NT版本上可用
  • choice.exe在Windows Vista和更高版本的Windows PC用户以及Windows Server 2003和更高版本的Windows服务器上默认可用。

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上默认可用。

由于以下原因,相对于 SET / P ,最好使用 CHOICE

  1. CHOICE (选项)仅接受在选项/C(和 Ctrl + C )之后指定的键(分别从 STDIN 读取的字符)和如果用户按下错误的键,则会输出错误的哔声。
  2. CHOICE (选择选择)不需要按下任何其他可接受的键。按下 SET / P 要求用户使用 RETURN ENTER 选择立即退出>。
  3. 可以使用 CHOICE 来定义默认选项,并且超时可以在几秒钟后自动继续使用默认选项,而无需等待用户。
  4. 输出更好地是从另一个批处理文件自动应答提示,该批处理文件在使用 CHOICE 时使用类似echo Y | call PromptExample.bat的提示来调用该批处理文件。
  5. 使用 CHOICE 可以更轻松地评估用户的选择,因为 CHOICE 退出时会根据按下的键(字符)分配一个值,该值已分配给 ERRORLEVEL ,接下来可以轻松对其进行评估。
  6. 如果用户仅按下键 RETURN ENTER ,则未定义 SET / P 上使用的环境变量,并且之前未定义提示用户。 SET / P 命令行上使用的环境变量将保持其当前值(如果之前已定义),并且用户只需按 RETURN ENTER
  7. 在出现 SET / P 提示时,用户可以自由输入任何内容,包括字符串,由于语法错误,该字符串稍后导致cmd退出批处理文件执行,或在执行错误的批处理文件上根本不包含在批处理文件中的命令的执行中。需要采取一些措施来确保 SET / P 的安全,以防止错误或故意输入错误的用户输入。

这是一个提示示例,其中使用了首选的 CHOICE SET / P choice.exe上的运行Windows的二手计算机上不可用。

@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: =!",使得可以在Windows NT4 / 2000 / XP上使用echo Y | call PromptExample.bat调用此批处理文件,并且不需要使用echo Y| call PromptExample.bat。在运行两个字符串比较之前,它将删除从 STDIN 读取的字符串中的所有空格。

echo Y | call PromptExample.bat导致将 Y SPACE 分配给环境变量UserChoice。这将导致两次处理提示,因为"Y "既不区分大小写,也不等于"N",也不等于"Y",而不先删除所有空格。因此,以{strong> Y SPACE 作为值的UserChoice将导致第二次运行带有选项N的提示,该选项在以下批处理文件中定义为默认值第二次提示执行,接下来将导致批处理文件处理的意外退出。是的, SET / P 的安全使用确实很棘手,不是吗?

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

更多提示:

  1. IF 将比较运算符左右两个字符串与包括进行双引号比较。因此,不区分大小写的比较不是UserChoiceNY的值,而是UserChoice""N"包围的值和"Y"
  2. IF 比较运算符EQUNEQ主要用于比较-2147483648到2147483647范围内的两个整数,而不是比较两个字符串。 EQUNEQ也可用于字符串比较,但是在无用的尝试将左字符串转换为整数的情况下,比较双引号中的字符串会导致结果。 EQUNEQ仅可用于已启用的命令扩展名。用于字符串比较的比较运算符为==not ... ==,即使已禁用的命令扩展名也可以使用,因为MS-DOS和Windows 95/98 / ME甚至command.com都已支持它们。有关 IF 比较运算符的详细信息,请参见Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files
  3. 命令goto :EOF需要启用的命令扩展名才能真正退出批处理文件处理。有关更多详细信息,请参见Where does GOTO :EOF return to?

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

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

另请参阅:

答案 4 :(得分:1)

这里更容易一点:

@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

答案 5 :(得分:1)

如果您希望批处理程序退回到提示并且不关闭提示(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.

希望这会有所帮助......

答案 6 :(得分:1)

这是我寻求是/否答案的方法。

它也不区分大小写。

这只是检查输入所给的错误,并将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

答案 7 :(得分:0)

这是一个简单的示例,我在Windows 10的备份(.bat /批处理)脚本中使用了该示例,这使我在进行备份时可以有不同的选择。

...

: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!

...

您可以根据需要容纳任意数量的这些积木。

答案 8 :(得分:0)

首先,打开终端。

然后,键入

cd ~
touch .sure
chmod 700 .sure

下一步,打开.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 ''

然后,关闭文件。

~/.sure ; ENTER COMMAND HERE

这将提示您确定是否继续执行命令。

答案 9 :(得分:0)

您可以考虑使用UI确认。

使用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,这将产生类似的弹出窗口。

使用buttons.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

答案 10 :(得分:0)

您也可以使用 Choice 命令

@echo off
echo Sure?

CHOICE /C YN 

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

:EXIT
exit

:CONTINUE
echo hi
pause

答案 11 :(得分:-2)

打开终端。输入以下内容

echo>sure.sh
chmod 700 sure.sh

将此内容粘贴到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&&'

现在,如果您在键入命令之前键入确定,它将在继续执行命令之前提示您。

希望这会有所帮助!