Board logo

标题: [文本处理] 批处理if语句嵌套语句执行两次 [打印本页]

作者: baijuyihaha    时间: 2009-9-14 18:29     标题: 批处理if语句嵌套语句执行两次

大家好,调试一个简单的批处理程序时遇到一个问题。如下图:

图中if语句中的echo.与set /p ask=Try again? [Y^|N]执行了2次,为什么呢?怎么修正程序?
以下是程序的源代码:
  1. @echo off
  2. :loop
  3. cls
  4. set num=
  5. set ask=
  6. set /p num=Enter a number:
  7. if "%num%"=="" (
  8. echo Please Input a number!!!
  9. ) else (
  10. echo You Entered number is %num%.
  11. :ask
  12. echo.
  13. set /p ask=Try again? [Y^|N]
  14. if /I "%ask%" NEQ "y" (if /I "%ask%"=="n" (exit) else (goto ask))
  15. )
  16. 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

把括号移一下就可以了。
  1. @echo off
  2. :loop
  3. cls
  4. set num=
  5. set ask=
  6. set /p num=Enter a number:
  7. if "%num%"=="" (
  8. echo Please Input a number!!!
  9. ) else (
  10. echo You Entered number is %num%.
  11. )
  12. :ask
  13. echo.
  14. set /p ask=Try again? [Y^|N]
  15. if /I "%ask%" NEQ "y" (if /I "%ask%"=="n" (exit) else (goto ask))
  16. 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