在实际的DOS中,批处理菜单中混合了“ goto”和“ call”命令的问题

问题描述 投票:1回答:1

我正在MS-DOS 6.22中创建一个批处理菜单,我需要将if errorlevelgotocall混合使用。我的订单有问题,因为它们未按预期执行。除了call之外,我无法使用file6.bat来启动其他批处理文件,因为我需要保留环境变量。

这是菜单的示例:

:MENU
@echo off
echo [1] Choice 1
echo [2] Choice 2
echo [3] Choice 3
echo [4] Choice 4
echo [5] Choice 5
echo [6] Choice 6
echo [7] Choice 7
echo [8] Choice 8
echo [Y] Choice Y
echo [Z] Choice Z
choice /c12345678YZ /n /m "Select an option"

if errorlevel 10 call file7.bat
if errorlevel 9 file6.bat
if errorlevel 8 call file5.bat
if errorlevel 7 call file4.bat
if errorlevel 6 call file3.bat
if errorlevel 5 call file2.bat
if errorlevel 4 goto menu3
if errorlevel 3 goto menu2
if errorlevel 2 goto menu1
if errorlevel 1 call file1.bat

这就是行为:

  • 如果选择1,它将执行第四个[goto menu3]。
  • 如果我选择2、3、4、5,Y和Z,它会正确响应。
  • 如果我选择6、7和8,则不会发生任何事情。

请您帮助我了解如何解决此问题?

batch-file dos
1个回答
0
投票

三个事实很重要:

  1. [COMMAND.COM的MS-DOS 6.22从批处理文件的顶部到底部处理另一行,除了命令GOTO用于继续批处理文件不是在下一行,而是在下一行在带有标签的行下方,该标签指定为命令GOTO的参数。] >>

  2. DOS命令处理器continues

  3. 处理另一个批处理文件上的一个批处理文件,如果在命令行上指定了其他批处理文件而不使用命令CALL,则不会返回到当前批处理文件。
  4. 条件if errorlevel X表示如果错误级别更大或等于1

  5. 。有必要使用两个条件来检查命令或应用程序的退出代码是否等于特定数字。必要的语法是:if errorlevel X if not errorlevel X+1 command。就像如果错误级别等于X,因为错误级别必须为大于等于X且等于X小于X + 1。这两个条件仅是如果错误等级等于X。示例:if errorlevel 6 if not errorlevel 7 call file3.bat仅导致调用file3.bat 如果错误级别等于6

    让我们一起看看由用户按下的键定义的用例。

用例1:

用户按下键Z。
  1. [CHOICE.COM退出,并为10分配了值ERRORLEVEL
  2. 第一个条件if errorlevel 10true
  3. ,因此批处理文件file7.bat由命令处理器调用。在完成对COMMAND.COM的处理之后,
  4. file7.bat继续在下一个IF
  5. 条件行上,除了它包含命令EXIT之外,该命令导致在真正执行时独立于调用层次结构退出命令过程。
  6. 第二条件if errorlevel 9评估不是
  7. CHOICE.COM的退出代码,但由批处理文件file7.bat返回到主批处理文件的退出代码。 file7.bat返回的退出代码很可能是0,因此,此第二个条件以及下面的所有其他条件都将评估为false

    用例2:

用户按下键Y。
  1. [CHOICE.COM退出,并为9分配了值ERRORLEVEL
  2. 第一个条件if errorlevel 10false
  3. 第二条件if errorlevel 9true
  4. ,导致执行file6.bat。此处不使用命令CALL。因此,在完成COMMAND.COM的处理后file6.bat不会返回到主批处理文件。因此,if errorlevel 9 file6.bat以下的所有内容在true的条件下都没有关系,因为批处理文件的处理以file6.bat的完成处理结束。

    用例3:用户按下键8

  1. [CHOICE.COM退出,并为8分配了值ERRORLEVEL
  2. 第一个条件if errorlevel 10false。
  3. 第二个条件if errorlevel 9false
  4. 第三条件if errorlevel 8true,因此批处理文件file5.bat由命令处理器调用
  5. COMMAND.COM在完成对file5.bat的处理之后,在下一个IF条件行上继续,除了它包含命令EXIT
  6. 并且也要执行。
  7. [第四条件if errorlevel 7评估批处理文件file5.bat返回到主批处理文件的退出代码,这很可能是0,因此此第四条件和下面的所有其他评估为false。] >
  8. 在用户按下键7,6或5

时,行为或多或少都相同。

用例4:用户按下键4

  1. [CHOICE.COM退出,并为4分配了值ERRORLEVEL
  2. 前六个条件的总和为false。
  3. 第七条件if errorlevel 4true
  4. ,因此执行命令GOTO,导致在带有标签menu3的行下方的行上继续批处理文件处理。因此,其他IF条件与该用例无关。

    在用户按下键[[3或2时,行为或多或少都相同。

用例5:

用户按下键1。
    [CHOICE.COM退出,并为1分配了值ERRORLEVEL
  • 前九个条件求和全部为[[false。
  • 最后一个条件if errorlevel 9true
  • ,因此批处理文件file1.bat由命令处理器
  • 调用。
  • COMMAND.COM在完成file1.bat的处理后继续在线,除了在file1.bat的处理中执行命令EXIT
  • 此代码至少存在三个潜在问题:

      如果
    1. 被叫
    批处理文件中的所有命令都没有像只包含一系列ERRORLEVEL的被叫批处理文件那样修改set variable=value的值,则IF下的下一个
  • IF
  • 条件导致调用另一个批处理文件的条件也是true,这导致调用另一个批处理文件或继续对menu3的代码进行批处理。在最后一个条件if errorlevel 1下的代码确定在所有那些批处理文件都以值0退出的情况下,从该主批处理文件中<其他批处理文件接下来将发生什么。[第三个问题可以通过在最后一个条件if errorlevel 1之后写在主批处理文件中来轻松解决,要么goto MENU继续在顶部继续打印批处理文件并再次打印菜单,或者是goto ENDBAT并在主批处理文件中最后一行:ENDBAT继续在批处理文件的末尾继续处理批处理文件,这意味着完成该批处理文件的处理。但是对于潜在的问题1和2,必须确保主批处理文件的处理不在调用其他批处理文件之后在下一个命令行上继续进行,而是例如通过菜单进行。
  • @echo off :MainMenu cls echo [1] Choice 1 echo [2] Choice 2 echo [3] Choice 3 echo [4] Choice 4 echo [5] Choice 5 echo [6] Choice 6 echo [7] Choice 7 echo [8] Choice 8 echo [Y] Choice Y echo [Z] Choice Z choice /C:12345678YZ /N /M "Select an option:" if errorlevel 10 set BatFile=7 if errorlevel 9 if not errorlevel 10 file6.bat if errorlevel 8 if not errorlevel 9 set BatFile=5 if errorlevel 7 if not errorlevel 8 set BatFile=4 if errorlevel 6 if not errorlevel 7 set BatFile=3 if errorlevel 5 if not errorlevel 6 set BatFile=2 if errorlevel 4 if not errorlevel 5 goto Menu3 if errorlevel 3 if not errorlevel 4 goto Menu2 if errorlevel 2 if not errorlevel 3 goto Menu1 if errorlevel 1 if not errorlevel 2 set BatFile=1 call file%BatFile%.bat set BatFile= goto MainMenu :Menu3 echo Here would be shown menu 3. goto ENDBAT :Menu2 echo Here would be shown menu 2. goto ENDBAT :Menu1 echo Here would be shown menu 1. goto ENDBAT :ENDBAT
  • 每个批处理文件的目标是在完成对被调用批处理文件的处理后继续显示主菜单。因此,只需定义一个要调用的批处理文件号的环境变量(如BatFile),并确保根据errorlevel设置的条件,始终只有一个

    IF

    条件为

    true CHOICE.COM

    上面的代码导致用户按下键[[Y]]时执行file6.bat,而忽略了该主批处理文件中的其余行。在子菜单1、2或3的适当代码上按<< 2>,

    3

    4键继续进行批处理文件处理,但是对于1
    5]键

    8,并且7是相应的批处理文件,然后定义的环境变量BatFile未定义,并且批处理文件的处理继续并再次打印主菜单,并让用户使用还有一个选择。

    当然,如果要调用的批处理文件具有不同的文件名,并且所有批处理的文件扩展名都相同,则也可以将批处理文件的完整文件名分配给环境变量BatFile,而不只是分配给它的编号。要调用的文件。在这种情况下,带有CALL的命令行为call %BatFile%.bat
    © www.soinside.com 2019 - 2024. All rights reserved.