如何在Windows批处理文件中做出“您确定”提示?


94

我有一个批处理文件,该文件可以自动将一堆文件从一个地方复制到另一个地方,然后自动备份。唯一有帮助的是,我不小心从命令缓冲区中选择了该命令,并大量覆盖了未提交的更改。

我的.bat文件需要什么代码才能显示“您确定”,并在运行文件的其余部分之前键入“ y”?如果键入的不是“ y”,则应在该行退出执行。

编辑 11月27日好的,我仍然未回答此问题,因为我仍然无法弄清楚。当我称“出口”时 它关闭了cmd.exe,这不是我想要的。所有这些都是因为Windows实现的命令缓冲区错误[至少不同于我以前习惯的]

Answers:


168

您想要类似:

@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

5
我唯一要添加的是SET AREYOUSURE=N在提示符之前添加一个命令,以清除选择(如果您之前已经在该命令窗口中运行过该脚本)。没有它,默认值将保留先前选择的选项。
isapir 2014年

4
@Igal我很确定the setlocal和the endlocal应该照顾好这一点。%AREYOUSURE%之后不再存在endlocal

1
@dudeprgm您可能是正确的。我认为我错过了代码中的内容。
isapir 2015年

2
...对于重要的两行用一些解释性的话将会更有价值。

@Joe也许他做不到,因为(像我一样)他(还)不了解他们。因此,如果您愿意,可以扩展答案或指向解释它的资源的链接,那将是惊人的:)
Marcus Mangelsdorf


15

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

SET /P variable=[promptString]

查看set /?更多信息


...比被接受的人更具洞察力,但显然我们生活在紧急时期。

8

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

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

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. 输出更好地是从另一个批处理文件自动应答提示,该批处理文件使用类似于echo Y | call PromptExample.bat使用CHOICE的方式通过提示调用批处理文件。
  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 ...

注意:此批处理文件使用的命令扩展名在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 /?

也可以看看:


1
这是一个难以置信的答案。从现在开始,我仅使用Choice.exe。
巴斯

从6.0开始,DOS中也使用了choice.exe
Brian Minton,

@BrianMinton那是不对的。CHOICE.COM默认情况下,在MS-DOS 6.0,MS-DOS 7.0,Windows 95和Windows 98上有可用的16位应用程序。但是choice.exe在Windows NT4,Windows 2000和Windows XP上没有默认安装。CHOICE.COM也可以在NT4,Windows 2000和Windows XP上使用,但是最好choice.exe从适当的资源工具包中使用32位。请参阅Rob van der Woude关于CHOICE的页面。CHOICE.COM和之间的选项有些不同choice.exe。但是,问题不在于DOS。
Mofi

5

这里有点简单:

@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

Y放置命令后,您想发生的事情。那就是...的目的:)
鲍勃·史密斯

我的意思是:%errorlevel%始终是整数值。请参阅此处获取包含示例的文档。
Stephan

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

0

如果要让批处理程序退出并返回到提示而不关闭提示(AKA cmd.exe),则可以使用“退出/ 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.

希望这可以帮助...


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!

...

您可以根据需要拥有任意数量的这些块。


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

在继续执行命令之前,这将提示您确定。


也许是bash,但肯定不是批量的。
斯蒂芬

哦。我猜不会。它仅适用于终端命令,不适用于批处理命令。很抱歉提供错误的信息。
user13636521

-1

打开终端。输入以下内容

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&&'

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

希望这会有所帮助!


也许是bash,但肯定不是批量的。
Stephan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.