标题: [其他] 批处理if...else判断内使用goto语句为何出错? [打印本页]
作者: techon 时间: 2011-5-19 00:57 标题: 批处理if...else判断内使用goto语句为何出错?
看最简单的一个例子:- @echo off
- if 3 gtr 0 (
- echo 3 大于 0
- goto :lad0
- echo...
- echo some code...
- echo...
- :lad0
- echo goto here
- echo.
- ) else (
- echo 3 不大于零???
- )
- pause&goto :EOF
复制代码
这个是正常的- @echo off
- SETLOCAL ENABLEDELAYEDEXPANSION
-
- set jg=99
- set jgl=3
-
- :lad0
- if !jgl! gtr 0 (
- set /a jgl-=1
- echo jgl===!jgl! jg=!jg!
- goto :lad0
- ) else (
- echo jgl 不大于零 !jgl! 不大于 0 jg=!jg!
- )
- pause&goto :EOF
复制代码
再看如下代码:- @echo off
- if 3 gtr 0 (
- echo 3 大于 0
- goto :lad0
- echo...
- echo some code...
- echo...
- :lad0
- echo goto here
- echo.
- ) else (echo 3 不大于零??? 这后面的代码都被忽略了???rem )
- echo 换了一行,3 不大于零???
- )
- echo.End
- pause&goto :EOF
复制代码
确实让人头痛,看起来在if...else 语句内有goto 的目的标签在 else 语句之前就会对else语句产生影响。。。
看下面这个嵌套的- @echo off
- SETLOCAL ENABLEDELAYEDEXPANSION
-
- set jg=99
- set jgl=3
-
- set jg2=9
- set jgl2=5
-
- if %jg% gtr 0 (
- echo jg 大于零
- :lad0
- if !jgl! gtr 0 (
- set /a jgl-=1
- echo jgl===!jgl! jg=!jg!
- goto :lad0
- ) else (
- echo jgl 不大于零 !jgl! 不大于 0 jg=!jg!
- )
- ) else (echo jg 不大于零 jg === %jg%---else所在行
- if %jg2% gtr 0 (
- echo jg2 大于零
- :lad1
- if !jgl2! gtr 0 (
- set /a jgl2-=1
- echo jgl2===!jgl2! jg2=!jg2!
- goto :lad1
- ) else (
- echo jgl2 不大于零 !jgl2! 不大于 0 jg2=!jg2!
- )
- ) else (echo jg2 不大于零 jg2 === %jg2%---else所在行
- echo jg2 不大于零 jg2 === %jg2%
- )
- echo jg 不大于零 jg === %jg%
- )
- pause&goto :EOF
复制代码
这逻辑错误可以使用 if ... if not .... 来解决- @echo off
- SETLOCAL ENABLEDELAYEDEXPANSION
-
- set jg=99
- set jgl=3
-
- set jg2=9
- set jgl2=5
-
- if %jg% gtr 0 (
- echo jg 大于零
- :lad0
- if !jgl! gtr 0 (
- set /a jgl-=1
- echo jgl===!jgl! jg=!jg!
- goto :lad0
- ) else (
- echo jgl 不大于零 !jgl! 不大于 0 jg=!jg!
- )
- )
- rem else (
- if not %jg% gtr 0 (
- if %jg2% gtr 0 (
- echo jg2 大于零
- :lad1
- if !jgl2! gtr 0 (
- set /a jgl2-=1
- echo jgl2===!jgl2! jg2=!jg2!
- goto :lad1
- )
- if not %jgl2% gtr 0 (
- echo jgl2 不大于零 !jgl2! 不大于 0 jg2=!jg2!
- )
- )
- if not %jg2% gtr 0 (
- echo jg2 不大于零 jg2 === %jg2%
- )
- echo jg 不大于零 jg === %jg%
- )
- pause&goto :EOF
复制代码
作者: tmplinshi 时间: 2011-5-19 12:01
原因是,执行 goto 后,就离开了当前的语句。
作者: 随风 时间: 2011-5-19 12:06
复合语句内使用标签本就是不“健康”的代码。
作者: andy七少 时间: 2011-5-19 12:27
很受用,谢谢
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |