命令行中多个 If 和 Else If 语句的问题

Posted

技术标签:

【中文标题】命令行中多个 If 和 Else If 语句的问题【英文标题】:Issues with multiple If and Else If statements in command line 【发布时间】:2021-04-24 23:54:19 【问题描述】:

基本上我正在命令行中处理一个项目,并且我试图让多个具有多个条件的 if 语句最终得到一些东西,在这种情况下,回显显示一些东西。这是一个例子:

if %piece%==1 if %haut%==1 (
    if %couleur%==1 (
        echo haut 1 1 1
) else if %couleur%==2 (
        echo haut 1 1 2
)) 
if %piece%==1 if %haut%==2 (
    if %couleur%==1 (
        echo haut 1 2 1
) else if %couleur%==2 (
        echo haut 1 2 2
))

现在可以正常工作,显示 echo 旁边显示的内容,当我添加第二个时,它也可以正常工作,如下所示:

if %piece%==1 if %haut%==1 (
    if %couleur%==1 (
        echo haut 1 1 1
) else if %couleur%==2 (
        echo haut 1 1 2
)) 
if %piece%==1 if %haut%==2 (
    if %couleur%==1 (
        echo haut 1 2 1
) else if %couleur%==2 (
        echo haut 1 2 2
))

if %piece%==2 if %haut%==1 (
    if %couleur%==1 (
        echo haut 2 1 1
) else if %couleur%==2 (
        echo haut 2 1 2
)) 
if %piece%==2 if %haut%==2 (
    if %couleur%==1 (
        echo haut 2 2 1
) else if %couleur%==2 (
        echo haut 2 2 2
))

但是一旦我添加了具有不同第二个条件的第三个,而不是 haut 它是 pantalon,它突然使程序崩溃而不是给出答案。

if %piece%==1 if %haut%==1 (
    if %couleur%==1 (
        echo haut 1 1 1
) else if %couleur%==2 (
        echo haut 1 1 2
)) 
if %piece%==1 if %haut%==2 (
    if %couleur%==1 (
        echo haut 1 2 1
) else if %couleur%==2 (
        echo haut 1 2 2
))

if %piece%==2 if %haut%==1 (
    if %couleur%==1 (
        echo haut 2 1 1
) else if %couleur%==2 (
        echo haut 2 1 2
)) 
if %piece%==2 if %haut%==2 (
    if %couleur%==1 (
        echo haut 2 2 1
) else if %couleur%==2 (
        echo haut 2 2 2
))

if %piece%==3 if %pantalon%==1 (
    if %couleur%==1 (
        echo pantalon 3 1 1
) else if %couleur%==2 (
        echo pantalon 3 1 2
)) 
if %piece%==3 if %pantalon%==2 (
    if %couleur%==1 (
        echo pantalon 3 2 1
) else if %couleur%==2 (
        echo pantalon 3 2 2
))

我也尝试过不使用 else if 并且只是堆叠了许多 if 语句,但出现了同样的问题。我将在最后添加整个代码以防万一,但我真的不知道这里的问题是什么以及为什么会这样。如果有人可以帮助我,将不胜感激!

这是完整的代码:

@echo off

:menu
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Quelle piece vestimentaire voulez-vous?
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo -------
echo Hommes
echo -------
echo Haut (1)
echo.
echo Haut (2)
echo.
echo Pantalon (3)
echo.
echo -------
echo Femmes/Tous genres confondus
echo -------
echo Haut (4)
echo.
echo Jupe (5)
echo.
echo Pantalon (6)
echo.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo.
set /p piece=

if %piece%==1 goto haut
if %piece%==2 goto haut
if %piece%==3 goto pantalon
if %piece%==4 goto haut
if %piece%==5 goto jupe
if %piece%==6 goto pantalon

:haut
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Quelle style d'haut voulez-vous?
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Haut (1)
echo.
echo Haut (2)
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p haut=

goto couleur

:pantalon
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Quelle style de pantalon voulez-vous?
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Pantalon (1)
echo.
echo Pantalon (2)
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p pantalon=

goto couleur

:jupe
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Quelle style de jupe voulez-vous?
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Jupe (1)
echo.
echo Jupe (2)
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p jupe=

goto couleur

:couleur
cls
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Quelle couleurs voulez-vous?
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Rouge et noir (1)
echo.
echo Blue et noir (2)
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo.
set /p couleur=

:export
cls

if %piece%==1 if %haut%==1 (
    if %couleur%==1 (
        echo haut 1 1 1
) else if %couleur%==2 (
        echo haut 1 1 2
)) 
if %piece%==1 if %haut%==2 (
    if %couleur%==1 (
        echo haut 1 2 1
) else if %couleur%==2 (
        echo haut 1 2 2
))

if %piece%==2 if %haut%==1 (
    if %couleur%==1 (
        echo haut 2 1 1
) else if %couleur%==2 (
        echo haut 2 1 2
)) 
if %piece%==2 if %haut%==2 (
    if %couleur%==1 (
        echo haut 2 2 1
) else if %couleur%==2 (
        echo haut 2 2 2
))

if %piece%==3 if %pantalon%==1 (
    if %couleur%==1 (
        echo pantalon 3 1 1
) else if %couleur%==2 (
        echo pantalon 3 1 2
)) 
if %piece%==3 if %pantalon%==2 (
    if %couleur%==1 (
        echo pantalon 3 2 1
) else if %couleur%==2 (
        echo pantalon 3 2 2
))

if %piece%==4 if %haut%==1 (
    if %couleur%==1 (
        echo haut 4 1 1
) else if %couleur%==2 (
        echo haut 4 1 2
)) 
if %piece%==4 if %haut%==2 (
    if %couleur%==1 (
        echo haut 4 2 1
) else if %couleur%==2 (
        echo haut 4 2 2
))

if %piece%==5 if %jupe%==1 (
    if %couleur%==1 (
        echo haut 4 1 1
) else if %couleur%==2 (
        echo haut 4 1 2
)) 
if %piece%==5 if %jupe%==2 (
    if %couleur%==1 (
        echo haut 4 2 1
) else if %couleur%==2 (
        echo haut 4 2 2
))

pause>nul
goto menu

如果您需要任何其他信息,我很乐意提供!

【问题讨论】:

检查%pantalon%是否定义正确。你的描述尖叫,它不是。 【参考方案1】:

我建议您不要使用Set /P 来接收预期的单个数字已知输入,而是使用更合适的内置choice.exe 实用程序。这将保证最终用户只能提供您已知列表中的输入。

至于你的if /else,结构体,我去掉了一些不必要的东西,因为如果很多选项不是1,那么它们必须默认为2,所以没有必要问一下if

@Echo Off
SetLocal EnableExtensions

:Menu
ClS
Set /A haut=pantalon=jupe=couleur=0
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle piece vestimentaire voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo -------
Echo Hommes
Echo -------
Echo Haut (1)
Echo(
Echo Haut (2)
Echo(
Echo Pantalon (3)
Echo(
Echo -------
Echo Femmes/Tous genres confondus
Echo -------
Echo Haut (4)
Echo(
Echo Jupe (5)
Echo(
Echo Pantalon (6)
Echo(
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo(
%SystemRoot%\System32\choice.exe /C 123456
Set "piece=%ERRORLEVEL%"
If %piece%==1 GoTo Haut
If %piece%==2 GoTo Haut
If %piece%==3 GoTo Pantalon
If %piece%==4 GoTo Haut
If %piece%==5 GoTo Jupe
If %piece%==6 GoTo Pantalon

:Haut
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle style d'haut voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Haut (1)
Echo(
Echo Haut (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%SystemRoot%\System32\choice.exe /C 12
Set "haut=%ERRORLEVEL%"
GoTo Couleur

:Pantalon
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle style de pantalon voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Pantalon (1)
Echo(
Echo Pantalon (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%SystemRoot%\System32\choice.exe /C 12
Set "pantalon=%ERRORLEVEL%"
GoTo Couleur

:Jupe
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle style de jupe voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Jupe (1)
Echo(
Echo Jupe (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%SystemRoot%\System32\choice.exe /C 12
Set "jupe=%ERRORLEVEL%"
GoTo Couleur

:Couleur
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle couleurs voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Rouge et noir (1)
Echo(
Echo Blue et noir (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo(
%SystemRoot%\System32\choice.exe /C 12
Set "couleur=%ERRORLEVEL%"

:Export
ClS
If %piece%==1 (
    If %haut%==1 (
        If %couleur%==1 (
            Echo haut 1 1 1
        ) Else (
            Echo haut 1 1 2
        )
    ) Else (
        If %couleur%==1 (
            Echo haut 1 2 1
        ) Else (
            Echo haut 1 2 2
        )
    )
)
If %piece%==2 (
    If %haut%==1 (
        If %couleur%==1 (
            Echo haut 2 1 1
        ) Else (
            Echo haut 2 1 2
        )
    ) Else (
        If %couleur%==1 (
            Echo haut 2 2 1
        ) Else (
            Echo haut 2 2 2
        )
    )
)
If %piece%==3 (
    If %pantalon%==1 (
        If %couleur%==1 (
            Echo pantalon 3 1 1
        ) Else (
            Echo pantalon 3 1 2
        )
    ) Else (
        If %couleur%==1 (
            Echo pantalon 3 2 1
        ) Else (
            Echo pantalon 3 2 2
        )
    )
)
If %piece%==4 (
    If %haut%==1 (
        If %couleur%==1 (
            Echo haut 4 1 1
        ) Else (
            Echo haut 4 1 2
        )
    ) Else (
        If %couleur%==1 (
            Echo haut 4 2 1
        ) Else (
            Echo haut 4 2 2
        )
    )
)
If %piece%==5 (
    If %jupe%==1 (
        If %couleur%==1 (
            Echo jupe 5 1 1
        ) Else (
            Echo jupe 5 1 2
        )
    ) Else (
        If %couleur%==1 (
            Echo jupe 5 2 1
        ) Else (
            Echo jupe 5 2 2
        )
    )
)
If %piece%==6 (
    If %pantalon%==1 (
        If %couleur%==1 (
            Echo pantalon 6 1 1
        ) Else (
            Echo pantalon 6 1 2
        )
    ) Else (
        If %couleur%==1 (
            Echo pantalon 6 2 1
        ) Else (
            Echo pantalon 6 2 2
        )
    )
)
Pause 1>NUL
GoTo Menu

然而,我个人会更像这样执行 if 部分:

If %piece%==1 If %haut%==1 (
        If %couleur%==1 (Echo haut 1 1 1) Else Echo haut 1 1 2
    ) Else If %couleur%==1 (Echo haut 1 2 1) Else Echo haut 1 2 2
If %piece%==2 If %haut%==1 (
        If %couleur%==1 (Echo haut 2 1 1) Else Echo haut 2 1 2
    ) Else If %couleur%==1 (Echo haut 2 2 1) Else Echo haut 2 2 2
If %piece%==3 If %pantalon%==1 (
        If %couleur%==1 (Echo pantalon 3 1 1) Else Echo pantalon 3 1 2
    ) Else If %couleur%==1 (Echo pantalon 3 2 1) Else Echo pantalon 3 2 2
If %piece%==4 If %haut%==1 (
        If %couleur%==1 (Echo haut 4 1 1) Else Echo haut 4 1 2
    ) Else If %couleur%==1 (Echo haut 4 2 1) Else Echo haut 4 2 2
If %piece%==5 If %jupe%==1 (
        If %couleur%==1 (Echo jupe 5 1 1) Else Echo jupe 5 1 2
    ) Else If %couleur%==1 (Echo jupe 5 2 1) Else Echo jupe 5 2 2
If %piece%==6 If %pantalon%==1 (
        If %couleur%==1 (Echo pantalon 6 1 1) Else Echo pantalon 6 1 2
    ) Else If %couleur%==1 (Echo pantalon 6 2 1) Else Echo pantalon 6 2 2

如果你所做的只是回应这些值,我会提供以下修改后的脚本,(不改变你的屏幕布局)

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

:Menu
ClS
Set /A haut=pantalon=jupe=couleur=0
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle piece vestimentaire voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo -------
Echo Hommes
Echo -------
Echo Haut (1)
Echo(
Echo Haut (2)
Echo(
Echo Pantalon (3)
Echo(
Echo -------
Echo Femmes/Tous genres confondus
Echo -------
Echo Haut (4)
Echo(
Echo Jupe (5)
Echo(
Echo Pantalon (6)
Echo(
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo(
%SystemRoot%\System32\choice.exe /C 123456
Set "piece=%ERRORLEVEL%"
If %piece%==1 GoTo Haut
If %piece%==2 GoTo Haut
If %piece%==3 GoTo Pantalon
If %piece%==4 GoTo Haut
If %piece%==5 GoTo Jupe
If %piece%==6 GoTo Pantalon

:Haut
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle style d'haut voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Haut (1)
Echo(
Echo Haut (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%SystemRoot%\System32\choice.exe /C 12
Set "haut=%ERRORLEVEL%"
GoTo Couleur

:Pantalon
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle style de pantalon voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Pantalon (1)
Echo(
Echo Pantalon (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%SystemRoot%\System32\choice.exe /C 12
Set "pantalon=%ERRORLEVEL%"
GoTo Couleur

:Jupe
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle style de jupe voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Jupe (1)
Echo(
Echo Jupe (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%SystemRoot%\System32\choice.exe /C 12
Set "jupe=%ERRORLEVEL%"
GoTo Couleur

:Couleur
ClS
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Quelle couleurs voulez-vous?
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo Rouge et noir (1)
Echo(
Echo Blue et noir (2)
Echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Echo(
%SystemRoot%\System32\choice.exe /C 12
Set "couleur=%ERRORLEVEL%"

:Export
ClS
For %%G In (haut pantalon jupe) Do (SetLocal EnableDelayedExpansion
    For %%H In (!%%G!) Do EndLocal & If %%H Gtr 0 Set "var=%%G" & Set "val=%%H")
Echo %var% %piece% %val% %couleur%
Pause 1> NUL
GoTo :Menu

【讨论】:

非常感谢!这确实有助于使项目变得更好,但是当我使用它时问题仍然存在。最后,除非我删除具有 %pantalon% 或 %jupe% 的 if 语句,否则程序会在到达末尾时崩溃,而不是让 echo 显示任何内容。不确定这是否是我的问题。 当未定义变量时(正如我在一小时前评论的那样),它会因为语法错误而崩溃。根据您的答案,程序流不会到达某些标签,从而导致变量未定义。要么重建你的逻辑(所以必须回答 每个 问题)或预定义你的变量(所有这些),如 set "pantalon=0" 等。 对不起@JackSamuel,否则我参与了,现在已经采用了一种方法来确保您的每个变量都有每个循环的预定义值,以防止 Stephan 现在两次提到的问题。我还为 If / Else 部分添加了一个潜在的修改,因为我不喜欢括号。 @Stephan 啊抱歉,我之前没有注意到您的评论,这正是问题所在,非常感谢! @Compo 无需道歉,非常感谢您的帮助。您不仅找到了我试图修复的解决方案,而且大大改进了我的程序。感谢您抽出宝贵时间提供帮助!【参考方案2】:
@ECHO OFF
SETLOCAL

:menu
FOR %%b IN (haut pantalon jupe couleur) DO SET /a %%b=0
CALL :accepter piece "piece vestimentaire" 123456 2 "Hommes" "Femmes/Tous genres confondus" 3 "Haut" "Haut" "Pantalon" 3 "Haut" "Jupe" "Pantalon"
GOTO piece%piece%


:haut
:Piece1
:Piece2
:Piece4
CALL :accepter haut "style d'haut" 12 0 2 "Haut" "Haut"
goto couleur

:pantalon
:piece3
:piece6
CALL :accepter pantalon "style de pantalon" 12 0 2 "Pantalon" "Pantalon"
goto couleur

:jupe
:piece5
CALL :accepter jupe "style de jupe" 12 0 2 "Jupe" "Jupe"
goto couleur

:couleur
CALL :accepter couleur "couleurs" 12 0 2 "Rouge et noir" "Blue et noir"

:export

cls
ECHO haut %haut% pantalon %pantalon% jupe %jupe% couleur %couleur%
pause>nul
goto menu

:: receive user input
:: %1 : receiving variable
:: %2 : Menu prompt
:: %3 : options list
:: %4 : number of groups
:: %5 : name of group (repeats %4 times)
:: %then : number of options within group
:: %followedby : Option name
:: %then, %followedby may be repeated

:accepter
cls
SETLOCAL ENABLEDELAYEDEXPANSION
:: remove variables starting groupname
For %%b IN (groupname) DO FOR  /F "delims==" %%a In ('set %%b 2^>Nul') DO SET "%%a="
SET "value=%1"
shift
SET "menuprompt=%~1"
shift
SET "options=%1"
SHIFT
SET "groups=%1"
SHIFT
SET /a groupcount=%groups%
SET /a groupindex=0
:getgroupname
IF %groupcount% neq 0 SET /a groupindex+=1&SET "groupname[!groupindex!]=%~1"&SHIFT&IF !groupindex! neq %groupcount% GOTO getgroupname

SET groupname

::
SET /a groupindex=0
SET /a option=0
SET "unusedoptions=%options%"
:: 
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Quelle %menuprompt% voulez-vous?
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:: Display group
:displaygroup
SET /a groupindex+=1
IF DEFINED groupname[%groupindex%] (
 echo -------
 echo !groupname[%groupindex%]!
 echo -------
)
SET numoptionsingroup=%1&SHIFT

:showoption
IF %numoptionsingroup% gtr 0 (
 ECHO %~1 (!unusedoptions:~0,1!^)
 ECHO.
 SET "unusedoptions=!unusedoptions:~1!"
 SHIFT
 SET /a numoptionsingroup-=1
 GOTO showoption
)
IF DEFINED unusedoptions GOTO displaygroup 

echo.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo.

choice /c %options% /M "%menuprompt%"
endlocal&SET %value%=%errorlevel%

GOTO :eof

【讨论】:

以上是关于命令行中多个 If 和 Else If 语句的问题的主要内容,如果未能解决你的问题,请参考以下文章

多个if else if语句的用法?

If...Then...Else 在 Then 之后有多个语句

Javascript 中多个条件的 If-Else 语句

在 C# 中使用带有多个 if 语句的 else

shell编程之 if 判断语句

if else 语句使用包含多个特殊字符的 char[] C#