[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 批处理if...else判断内使用goto语句为何出错?

看最简单的一个例子:
  1. @echo off
  2. if 3 gtr 0 (
  3.     echo 3 大于 0
  4.     goto :lad0
  5.     echo...
  6.     echo some code...
  7.     echo...
  8.     :lad0
  9.     echo goto here
  10.     echo.
  11. ) else (
  12.     echo 3 不大于零???
  13. )
  14. pause&goto :EOF
复制代码
这个是正常的
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set jg=99
  4. set jgl=3
  5. :lad0
  6. if !jgl! gtr 0 (
  7.   set /a jgl-=1
  8.   echo jgl===!jgl! jg=!jg!
  9.   goto :lad0
  10. ) else (
  11.   echo jgl 不大于零 !jgl! 不大于 0 jg=!jg!
  12. )
  13. pause&goto :EOF
复制代码
再看如下代码:
  1. @echo off
  2. if 3 gtr 0 (
  3.     echo 3 大于 0
  4.     goto :lad0
  5.     echo...
  6.     echo some code...
  7.     echo...
  8.     :lad0
  9.     echo goto here
  10.     echo.
  11. ) else (echo 3 不大于零??? 这后面的代码都被忽略了???rem )
  12.   echo 换了一行,3 不大于零???
  13. )
  14. echo.End
  15. pause&goto :EOF
复制代码
确实让人头痛,看起来在if...else 语句内有goto 的目的标签在 else 语句之前就会对else语句产生影响。。。
看下面这个嵌套的
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set jg=99
  4. set jgl=3
  5. set jg2=9
  6. set jgl2=5
  7. if %jg% gtr 0 (
  8.   echo jg 大于零
  9.   :lad0
  10.   if !jgl! gtr 0 (
  11.     set /a jgl-=1
  12.     echo jgl===!jgl! jg=!jg!
  13.     goto :lad0
  14.   ) else (
  15.     echo jgl 不大于零 !jgl! 不大于 0 jg=!jg!
  16.   )
  17. ) else (echo jg 不大于零 jg === %jg%---else所在行
  18.   if %jg2% gtr 0 (
  19.     echo jg2 大于零
  20.     :lad1
  21.     if !jgl2! gtr 0 (
  22.       set /a jgl2-=1
  23.       echo jgl2===!jgl2! jg2=!jg2!
  24.       goto :lad1
  25.     ) else (
  26.       echo jgl2 不大于零 !jgl2! 不大于 0 jg2=!jg2!
  27.     )
  28.   ) else (echo jg2 不大于零 jg2 === %jg2%---else所在行
  29.     echo jg2 不大于零 jg2 === %jg2%
  30.   )
  31.   echo jg 不大于零 jg === %jg%
  32. )
  33. pause&goto :EOF
复制代码
这逻辑错误可以使用 if ...         if not .... 来解决
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set jg=99
  4. set jgl=3
  5. set jg2=9
  6. set jgl2=5
  7. if %jg% gtr 0 (
  8.   echo jg 大于零
  9.   :lad0
  10.   if !jgl! gtr 0 (
  11.     set /a jgl-=1
  12.     echo jgl===!jgl! jg=!jg!
  13.     goto :lad0
  14.   ) else (
  15.     echo jgl 不大于零 !jgl! 不大于 0 jg=!jg!
  16.   )
  17. )
  18. rem  else (
  19. if not %jg% gtr 0 (
  20.   if %jg2% gtr 0 (
  21.     echo jg2 大于零
  22.     :lad1
  23.     if !jgl2! gtr 0 (
  24.       set /a jgl2-=1
  25.       echo jgl2===!jgl2! jg2=!jg2!
  26.       goto :lad1
  27.     )
  28.     if not %jgl2% gtr 0 (
  29.       echo jgl2 不大于零 !jgl2! 不大于 0 jg2=!jg2!
  30.     )
  31.   )
  32.   if not %jg2% gtr 0 (
  33.     echo jg2 不大于零 jg2 === %jg2%
  34.   )
  35.   echo jg 不大于零 jg === %jg%
  36. )
  37. pause&goto :EOF
复制代码

很受用,谢谢

TOP

复合语句内使用标签本就是不“健康”的代码。
技术问题请到论坛发帖求助!

TOP

原因是,执行 goto 后,就离开了当前的语句。

TOP

返回列表