标题: [文本处理] 批处理if语句嵌套语句执行两次 [打印本页]
作者: baijuyihaha 时间: 2009-9-14 18:29 标题: 批处理if语句嵌套语句执行两次
大家好,调试一个简单的批处理程序时遇到一个问题。如下图:
图中if语句中的echo.与set /p ask=Try again? [Y^|N]执行了2次,为什么呢?怎么修正程序?
以下是程序的源代码:- @echo off
- :loop
- cls
- set num=
- set ask=
- set /p num=Enter a number:
- if "%num%"=="" (
- echo Please Input a number!!!
- ) else (
- echo You Entered number is %num%.
- :ask
- echo.
- set /p ask=Try again? [Y^|N]
- if /I "%ask%" NEQ "y" (if /I "%ask%"=="n" (exit) else (goto ask))
- )
- goto loop
复制代码
作者: zhouyongjun 时间: 2009-9-14 22:38
你这是个if...else...的复合语句
批处理遇到这样的语句首先要进行预处理,会把里面的变量全部用前面定义的值来代替再执行,而ask在整个语句之前没被定义,所以第一次执行到此处时实际是运行if /I "" NEQ "y",所以运行了goto ask。
复合语句中不宜使用标签,一旦goto后就跳出了复合语句,第二次ask的值才会是你定义的值。
你的代码可以开启变量延迟来解决
可在论坛搜索“变量延迟”
作者: inittab 时间: 2009-9-15 11:42
把括号移一下就可以了。- @echo off
- :loop
- cls
- set num=
- set ask=
- set /p num=Enter a number:
- if "%num%"=="" (
- echo Please Input a number!!!
- ) else (
- echo You Entered number is %num%.
- )
- :ask
- echo.
- set /p ask=Try again? [Y^|N]
- if /I "%ask%" NEQ "y" (if /I "%ask%"=="n" (exit) else (goto ask))
-
- goto loop
复制代码
作者: baijuyihaha 时间: 2009-9-16 15:23
原帖由 zhouyongjun 于 2009-9-14 22:38 发表
你这是个if...else...的复合语句
批处理遇到这样的语句首先要进行预处理,会把里面的变量全部用前面定义的值来代替再执行,而ask在整个语句之前没被定义,所以第一次执行到此处时实际是运行if /I "" NEQ "y",所以运 ...
给个解决方案,谢谢!
作者: Seter 时间: 2009-9-20 21:48
懒得看了..根据2楼的意思是加个setlocal enabledelayedexpansion么?
作者: inittab 时间: 2009-9-20 23:40
呵,我的感觉。
不要把简单的问题复杂化。在if 内部加goto. 或在for 内部加goto .本身就是很不规范的写法。
应尽力避免的。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |