Board logo

标题: [其他] 批处理if...else判断内使用goto语句为何出错? [打印本页]

作者: techon    时间: 2011-5-19 00:57     标题: 批处理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
复制代码

作者: tmplinshi    时间: 2011-5-19 12:01

原因是,执行 goto 后,就离开了当前的语句。
作者: 随风    时间: 2011-5-19 12:06

复合语句内使用标签本就是不“健康”的代码。
作者: andy七少    时间: 2011-5-19 12:27

很受用,谢谢




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2