看最简单的一个例子:- @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
复制代码
|