找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26122|回复: 3

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

[复制链接]
发表于 2011-5-19 00:57:33 | 显示全部楼层 |阅读模式
看最简单的一个例子:

  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
复制代码
发表于 2011-5-19 12:01:31 | 显示全部楼层
原因是,执行 goto 后,就离开了当前的语句。
发表于 2011-5-19 12:06:10 | 显示全部楼层
复合语句内使用标签本就是不“健康”的代码。
发表于 2011-5-19 12:27:35 | 显示全部楼层
很受用,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 13:11 , Processed in 0.017383 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表