I just tried to code a simple batch which will help me copy some files with some user-slected options. This batch file exits as soon as it reaches the big if statement
Rem @echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a verifier="true to ok: "
:begin
echo Welcome to install!
echo Y - Install
echo N - Remove
choice /m "Select Y/N : "
if "!errorlevel!"=="1" ( echo Installation: echo Y - Default echo N - Custom choice /m "Select Y/N : " if "!errorlevel!"=="2" ( echo Custom selected goto custom ) else ( xcopy %cd% C:\FPC\ if "%verifier%"=="true" ( echo Install OK! ) else ( echo Installation goes wrong! ) ) echo echo Y - Run now echo N - Don't run choice /m "Select Y/N :" if "!errorlevel!"=="1" ( echo Run start start.cmd ) else ( echo Don't run ) goto theend
) else ( echo Removal goto remove
)
SETLOCAL DISABLEDELAYEDEXPANSION
goto theend
:remove
echo delete something
goto theend
:custom
echo run another batch file
goto theend
:theend
echo the end
pauseThe batch exits immediately after I typed the (Y/N) choice. I guess the problem comes from the big if, but I can't find where is wrong or what I'm missing here. Thank you for your help! Sorry for my bad english.
81 Answer
Your use of Choice is somewhat... mangled. And your Nested If's are an Unnecesary Complication - Your Making things Harder on yourself than necessary.
Syntax should be:
CHOICE /N /C:ir /M "[I]nstall [R]emove"
IF ERRORLEVEL ==2 GOTO Remove
IF ERRORLEVEL ==1 GOTO Install
:Install
CHOICE /N /C:dc /M "[D]efault [C]ustom"
IF ERRORLEVEL ==2 GOTO Custom
IF ERRORLEVEL ==1 GOTO Default
:Default
xcopy %cd% C:\FPC\ || GOTO Install_Error
CHOICE /N /C:re /M "[R]un [E]xit"
IF ERRORLEVEL ==2 GOTO Run
IF ERRORLEVEL ==1 GOTO theend
:Remove
::: options /actions
:Custom
::: options /actions
:Run
::: options /actions
:Install_Error
::: options /actions
:theend
::: options /actionsNote: || At the end of xcopy Does the following Command when the command preceding || returns an Errorlevel
Using choice like this saves alot of headaches and makes your code more readable and easier to maintain.
If you want to save yourself some typing, heres a way to make it simpler.
At the start of your batch:
Set "ask=CHOICE /N /C:"
Set "doIF=IF ERRORLEVEL =="And then whenever you need choice:
%ask%ir /M "[I]nstall [R]emove"
%doIF%2 GOTO Remove
%doIF%1 GOTO Install 1