批处理文件,如果语句不起作用

时间:2017-09-30 18:29:27

标签: batch-file if-statement

以下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语句的替代方法,因为此方法非常耗时。

3 个答案:

答案 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标签下方添加所需的代码即可!