以下if语句未运行。它只是结束bat文件它停止进程。为什么会这样?我该如何阻止它?
if "%Choice%"=="si" (GOTO Case2) else (
if "%Choice%"=="s" (GOTO Case1) else (
if "%Choice%"=="ti" (GOTO Case4) else (
if "%Choice%"=="t" (GOTO Case3) else (
if "%Choice%"=="i" (GOTO Case5) else (
if "%Choice%"=="cp" (GOTO Case6) else (
if "%Choice%"=="kp" (GOTO Case7) else (
if "%Choice%"=="?" (GOTO CaseHelp) else (
if "%Choice%"=="c" (GOTO Case8) else (
if "%Choice%"=="sl" (GOTO Case9) else (
if "%Choice%"=="sf" (GOTO Case10) else (
if "%Choice%"=="fz" (GOTO Case11) else (
if "%Choice%"=="dc" (GOTO Case12) else (
if "%Choice%"=="cm" (GOTO Case12) else (
if "%Choice%"=="wh" (GOTO Case13) else (
if "%Choice%"=="vs" (GOTO Case14) else (
if "%Choice%"=="it" (GOTO Case15) else (
if "%Choice%"=="tm" (GOTO Case16) else (
if "%Choice%"=="d" (GOTO Case17) else (
if "%Choice%"=="ed" (GOTO Case18) else (
if "%Choice%"=="be" (GOTO Case19) else (
if "%Choice%"=="me" (GOTO Case20) else (
if "%Choice%"=="ap" (GOTO Case21) else (
if "%Choice%"=="pc" (GOTO Case22) else (
if "%Choice%"=="sc" (GOTO Case23) else (
if "%Choice%"=="c" (GOTO Case24) else (
if "%Choice%"=="ll" (GOTO Case25) else (
if "%Choice%"=="ij" (GOTO Case26) else (
GOTO CaseError)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
此外,是否有使用if语句的替代方法,因为此方法非常耗时。
答案 0 :(得分:4)
好吧,我看到28开放(
,但只有24关闭)
,所以它无法正常工作。
您没有显示完整的相关代码,我们无法查看您是否拥有所有必需的代码。
PaulF在his comment中有一个很好的观点,因为每个IF都有一个GOTO,你不需要任何ELSE语句。
if "%Choice%"=="si" GOTO Case2
if "%Choice%"=="s" GOTO Case1
if "%Choice%"=="ti" GOTO Case4
etc...
if "%Choice%"=="ij" GOTO Case26
goto CaseError
但是,假设你没有对每个IF做GOTO,而是做其他事情。没有必要做很多缩进,你不需要这么多的麻烦。 Batch没有正式拥有ElseIf,但如果你使用ELSE IF,它的功能也同样适用。看看我如何安排parens和缩进 - 阅读和遵循代码要容易得多。
if "%Choice%"=="xxx" (
do something
) else if "%Choice%"=="yyy" (
do something else
) else if "%Choice%"=="zzz" (
do something different
) else (
everything else gets to here
)
由于您正在执行GOTO,因此还有另一种选择。将%Choice%值合并到:标签中,然后除了验证选择是否有效外,您不需要任何IF语句,如果不是,则采取特殊措施。
Opion 1:定义有效条目列表,并使用find / replace测试选项是否在有效选项中。最好通过延迟扩展来完成。请注意,选项列表中的前导和尾随空格在此技术中非常重要。
setlocal enableDelayedExpansion
set "options= si s ti t i cp kp ? c sl sf fz dc cm wh vs it tm d ed be me ap pc sc c ll ij "
set "choice="
set /p "choice=Enter your choice: "
if "!options: %choice% =!" neq "!options!" goto case_%choice%
goto case_error
:case_si
rem do something
exit /b
:case_s
rem do something else
exit /b
etc...
选项2:使用FINDSTR探测批处理文件本身以验证标签是否存在。在这里,我使用简化的搜索,不会处理有效标签的所有可能安排。但只要你不对创建标签的方式有所了解,它就应该没问题。
set "choice="
set /p "choice=Enter your choice: "
findstr /i /r /c:"^:case_%choice%$" /c:"^:case_%choice% " "%~f0" >nul 2>nul && goto :case_%choice%
goto :case_error
:Case_si
rem do something
exit /b
:Case_s
rem do something else
exit /b
etc...
答案 1 :(得分:2)
我建议在28个选项中使用命令 CHOICE 进行大量选择:
@echo off
:Menu
cls
echo 1 ... option 1
echo 2 ... option 2
echo and so on
echo 9 ... option 9
echo a ... option 10
echo and so on
echo r option 27
echo 0 ... help
echo/
%SystemRoot%\System32\choice.exe /C 123456789abcdefghijklmnopqr0 /N /M "Your choice: "
goto Case%ERRORLEVEL%
:Case1
echo Option 1
goto :EOF
:Case2
echo Option 2
goto :EOF
rem And so on
:Case28
cls
echo Help
echo/
pause
goto :Menu
命令 CHOICE 不允许任何无效输入。它等待使用的选项,直到用户按下参数/C
之后指定的任何键,并根据列表中相应键/字符的索引为ERRORLEVEL
分配号码,即第一个{{1 1}},2表示第二个1
,28表示最后一个键/字符2
。在命令提示符窗口0
中运行以获取有关此命令的帮助。
choice /?
开头并以匹配goto Case%ERRORLEVEL%
结尾的命令块内,则 (
无效,因为变量引用)
已被当前替换在执行%ERRORLEVEL%
命令之前,环境变量ERRORLEVEL
的值完全执行。
在这种情况下必须启用延迟扩展,并且必须使用(
才能使 GOTO 在命令块中工作。在命令提示符goto Case!ERRORLEVEL!
中运行,并在几个窗口页面上读取hep输出,以获取有关延迟扩展的详细信息,以及用于启用延迟扩展的set /?
和用于恢复上一个命令环境的setlocal /?
。 / p>
在不使用延迟环境变量扩展的情况下,命令块中菜单的替代解决方案是将命令行endlocal /?
替换为
goto Case%ERRORLEVEL%
请参阅Microsoft支持文章,了解Testing for a Specific Error Level in Batch Files为什么在执行for /L %%X in (28,-1,1) do if errorlevel %%X goto Case%%X
的情况下执行if errorlevel X
条件的递减 FOR 循环无法在不使用延迟扩展的情况下运行
答案 2 :(得分:1)
我认为这是解决此问题的最简单方法:
@echo off
setlocal
set /p "Choice= Which Service? "
call :Case-%choice% 2> NUL
if errorlevel 1 goto CaseError
goto :EOF
:Case-si
echo You select "si" service
exit /B
:Case-s
echo You select "s" service
exit /B
:Case-etc
echo You select "etc" service
exit /B
:CaseError
echo Error: invalid service...
goto :EOF
当执行带有未定义标签的call
时,系统会自动将ERRORLEVEL设置为1并继续到下一行,因此您只需要if
发现这样的错误...
使用此方法,您无需检查每个选项,只需在每个正确的:Case-serviceNameHere
标签下方添加所需的代码即可!