I have a batch file that automates copying a bunch of files from one place to the other and back for me. Only thing is as much as it helps me I keep accidentally selecting t
try the CHOICE command, e.g.
CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
Here is a simple example which I use in a backup (.bat / batch) script on Windows 10, which allows me to have different options when making backups.
...
: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!
...
You can have as many as you need of these blocks.
You want something like:
@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
You can consider using a UI confirmation.
With 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 --
the user will see the following and depending on the choice the script will continue:
with absolutely the same script you can use also iexpYNbutton.bat which will produce similar popup.
With buttons.bat you can try the following script:
@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 --
and the user will see:
Here's my go-to method for a yes/no answer.
It's case-insensitive also.
This just checks for the errors given by the input and sets the choice
variable to whatever you require so it can be used below in the code.
@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
There are two commands available for user prompts on windows command line:
/P
available on all Windows NT versions with enabled command extensions andset is an internal command of Windows command processor cmd.exe
. The option /P
to prompt a user for a string is available only with enabled command extensions which are enabled by default as otherwise nearly no batch file would work anymore nowadays.
choice.exe is a separate console application (external command) located in %SystemRoot%\System32
. choice.exe
of Windows Server 2003 can be copied into directory %SystemRoot%\System32
on a Windows XP machine for usage on Windows XP like many other commands not available by default on Windows XP, but available by default on Windows Server 2003.
It is best practice to favor usage of CHOICE over usage of SET /P because of the following reasons:
/C
(and Ctrl+C) and outputs an error beep if the user presses a wrong key.echo Y | call PromptExample.bat
on using CHOICE.cmd
because of a syntax error, or in execution of commands not included at all in the batch file on not good coded batch file. It needs some efforts to get SET /P secure against by mistake or intentionally wrong user input.Here is a prompt example using preferred CHOICE and alternatively SET /P on choice.exe
not available on used computer running 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 ...
Note: This batch file uses command extensions which are not available on Windows 95/98/ME using command.com
instead of cmd.exe
as command interpreter.
The command line set "UserChoice=!UserChoice: =!"
is added to make it possible to call this batch file with echo Y | call PromptExample.bat
on Windows NT4/2000/XP and do not require the usage of echo Y| call PromptExample.bat
. It deletes all spaces from string read from STDIN before running the two string comparisons.
echo Y | call PromptExample.bat
results in YSPACE getting assigned to environment variable UserChoice
. That would result on processing the prompt twice because of "Y "
is neither case-insensitive equal "N"
nor "Y"
without deleting first all spaces. So UserChoice
with YSPACE as value would result in running the prompt a second time with option N
as defined as default in the batch file on second prompt execution which next results in an unexpected exit of batch file processing. Yes, secure usage of SET /P is really tricky, isn't it?
For even more details on usage of SET /P and CHOICE for prompting user for a choice from a list of options see answer on How to stop Windows command interpreter from quitting batch file execution on an incorrect user input?
Some more hints:
UserChoice
with N
and Y
, but the value of UserChoice
surrounded by "
with "N"
and "Y"
.EQU
and NEQ
are designed primary for comparing two integers in range -2147483648 to 2147483647 and not for comparing two strings. EQU
and NEQ
work also for strings comparisons, but result on comparing strings in double quotes on a useless attempt to convert left string to an integer. EQU
and NEQ
can be used only with enabled command extensions. The comparison operators for string comparisons are ==
and not ... ==
which work even with disabled command extensions as even command.com
of MS-DOS and Windows 95/98/ME already supported them. For more details on IF comparison operators see Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files.goto :EOF
requires enabled command extensions to really exit batch file processing. For more details see Where does GOTO :EOF return to?For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
See also:
set "variable=value"
on assigning a string to an environment variable.if errorlevel X
behavior and operator &
.|
and handle STDIN.SystemRoot
.