我的批处理文件在到达嵌套的 IF 语句时退出

我的批处理文件在到达嵌套的 IF 语句时退出

我刚刚尝试编写一个简单的批处理程序,它将帮助我复制一些带有用户选择的选项的文件。此批处理文件在到达大 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

相关内容