【问题标题】:Windows batch file - GOTO command is ignoredWindows 批处理文件 - GOTO 命令被忽略
【发布时间】:2013-06-27 15:05:35
【问题描述】:

这是一个愚蠢的问题,但请帮忙,否则我的大脑会爆炸! ;)) 一些我不明白的愚蠢的事情......

简而言之:为什么在我选择数字 7(退出)后,返回的 ERRORLEVEL 是正确的,但 GOTO 指定的标签被忽略,而是转到 allTask​​sReboot 标签...

这是我的“代码”...

@echo off
mode con: cols=150 lines=65
@echo ------------------------------------------------------------------------------------------------
@echo INSTALLATION MENU
@echo ------------------------------------------------------------------------------------------------
@echo [ 1 ].All tasks - Unattended with reboot on finish
@echo [ 2 ].All tasks - Unattended without reboot on finish
@echo [ 3 ].All tasks except Software group - Unattended with reboot on finish
@echo [ 4 ].All tasks except Software group - Unattended without reboot on finish
@echo [ 5 ].All tasks except Java 7 installation - Unattended without reboot on finish
@echo [ 6 ].Install only VNC - Unattended
@echo [ 7 ].Exit
@echo ------------------------------------------------------------------------------------------------
@echo ------------------------------------------------------------------------------------------------
CHOICE /C:1234567 /N /M "Choose number for installation type."
@echo You press: %ERRORLEVEL%
@pause
IF ERRORLEVEL 1 GOTO allTasksReboot
IF ERRORLEVEL 2 GOTO allTasks
IF ERRORLEVEL 3 GOTO allExceptSoftwareReboot
IF ERRORLEVEL 4 GOTO allExceptSoftware
IF ERRORLEVEL 5 GOTO allTasksExceptJava
IF ERRORLEVEL 6 GOTO onlyVnc
IF ERRORLEVEL 7 GOTO scriptend

:allTasksReboot
@echo **************************************************************************
@echo All tasks - Unattended with reboot on finish
@echo **************************************************************************
@pause
goto scriptend

:scriptend
@echo Lets exit...
@pause

:goexit

【问题讨论】:

    标签: windows batch-file cmd choice errorlevel


    【解决方案1】:

    请记住,IF ERRORLEVEL N command 测试当前的 ERRORLEVEL 值是否大于或等于给定数字,因此必须始终按错误级别的降序执行此命令。您可以通过这种方式更改您的 IF 命令:

    IF %ERRORLEVEL% EQU 1 GOTO allTasksReboot
    IF %ERRORLEVEL% EQU 2 GOTO allTasks
    .....
    

    或者,如果您将标签更改为严格格式的标签并使用直接 GOTO 命令,您可能会大大简化代码:

    CHOICE /C:1234567 /N /M "Choose number for installation type."
    @echo You press: %ERRORLEVEL%
    @pause
    GOTO LABEL-%ERRORLEVEL%
    
    :LABEL-1  allTasksReboot
    @echo **************************************************************************
    @echo All tasks - Unattended with reboot on finish
    @echo **************************************************************************
    @pause
    goto scriptend
    
    :LABEL-7  scriptend
    @echo Lets exit...
    @pause
    
    :goexit
    

    【讨论】:

    • 我选择你的答案是因为你解释了为什么会发生这个“错误”。还要感谢您提供带有标签-%errorlevel% 的代码技巧示例 :)
    【解决方案2】:

    试试这个:

    IF ERRORLEVEL 7 GOTO scriptend
    IF ERRORLEVEL 6 GOTO onlyVnc
    IF ERRORLEVEL 5 GOTO allTasksExceptJava
    IF ERRORLEVEL 4 GOTO allExceptSoftware
    IF ERRORLEVEL 3 GOTO allExceptSoftwareReboot
    IF ERRORLEVEL 2 GOTO allTasks
    IF ERRORLEVEL 1 GOTO allTasksReboot
    

    【讨论】:

      【解决方案3】:

      我可能最喜欢使用带有LABEL-<n> 名称的单个GOTO,但@Endoro 的解决方案是使用IF ERRORLEVEL 的正确方法。 如果您不想订购 IF 检查,也可以使用 %ERRORLEVEL% 的值:

      IF %ERRORLEVEL% EQU 7 GOTO scriptend
      IF %ERRORLEVEL% EQU 5 GOTO allTasksExceptJava
      IF %ERRORLEVEL% EQU 2 GOTO allTasks
      IF %ERRORLEVEL% EQU 6 GOTO onlyVnc
      IF %ERRORLEVEL% EQU 1 GOTO allTasksReboot
      IF %ERRORLEVEL% EQU 3 GOTO allExceptSoftwareReboot
      IF %ERRORLEVEL% EQU 4 GOTO allExceptSoftware
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2017-11-10
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 2021-10-27
        • 2011-09-10
        相关资源
        最近更新 更多