我有一个批处理文件,可以自动将一堆文件从一个地方复制到另一个地方,然后再回复给我。唯一的事情就是它帮助我,我不小心选择了命令缓冲区中的命令,并大量覆盖未经修改的更改。
我的.bat文件需要什么代码才能让它说“你确定”,并让我在运行文件的其余部分之前输入“y”吗?如果输入“y”以外的任何内容,则应退出该行的执行。
编辑 11月27日 好吧,我再次标记这个没有答案,因为我仍然无法弄明白。当我打电话给“退出”时它关闭cmd.exe这不是我想要的。这一切都是因为Windows实现了命令缓冲区错误[与我至少习惯的不同]
答案 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命令行上有两个命令可用于用户提示:
/P
在所有启用了命令扩展和 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
/C
(和 Ctrl + C )之后指定的键(分别从 STDIN 读取的字符)和如果用户按下错误的键,则会输出错误的哔声。echo Y | call PromptExample.bat
的提示来调用该批处理文件。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? >
更多提示:
UserChoice
与N
和Y
的值,而是UserChoice
被"
与"N"
包围的值和"Y"
。EQU
和NEQ
主要用于比较-2147483648到2147483647范围内的两个整数,而不是比较两个字符串。 EQU
和NEQ
也可用于字符串比较,但是在无用的尝试将左字符串转换为整数的情况下,比较双引号中的字符串会导致结果。 EQU
和NEQ
仅可用于已启用的命令扩展名。用于字符串比较的比较运算符为==
和not ... ==
,即使已禁用的命令扩展名也可以使用,因为MS-DOS和Windows 95/98 / ME甚至command.com
都已支持它们。有关 IF 比较运算符的详细信息,请参见Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files。goto :EOF
需要启用的命令扩展名才能真正退出批处理文件处理。有关更多详细信息,请参见Where does GOTO :EOF return to? 要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
另请参阅:
set "variable=value"
的原因。if errorlevel X
行为和运算符&
的详细信息。|
并处理 STDIN 。SystemRoot
进行了解释。答案 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确认。
@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 --
用户将看到以下内容,并且根据选择,脚本将继续:
使用完全相同的脚本,您也可以使用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 --
,用户将看到:
答案 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&&'
现在,如果您在键入命令之前键入确定,它将在继续执行命令之前提示您。
希望这会有所帮助!