我刚刚尝试编写一个简单的批处理程序,它将帮助我复制一些带有用户选择的选项的文件。此批处理文件在到达大 if 语句时立即退出
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
pause
在我输入 (Y/N) 选项后,批处理立即退出。我猜问题出在那个大 if 上,但我找不到哪里出错了,或者我遗漏了什么。谢谢你的帮助!抱歉我的英语不好。
答案1
您对 Choice 的使用有些……混乱。而且您的嵌套 If 是不必要的复杂化 - 您让事情变得比必要的更困难。
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 /actions
笔记:||在 xcopy 的末尾,当前面的命令执行时,执行以下命令||返回一个 Errorlevel
使用这样的选择可以省去很多麻烦,并使您的代码更具可读性和更易于维护。
如果您想节省一些打字时间,这里有一个更简单的方法。
在批次开始时:
Set "ask=CHOICE /N /C:"
Set "doIF=IF ERRORLEVEL =="
然后,无论何时你需要选择:
%ask%ir /M "[I]nstall [R]emove"
%doIF%2 GOTO Remove
%doIF%1 GOTO Install