[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理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
复制代码

你这是个if...else...的复合语句
批处理遇到这样的语句首先要进行预处理,会把里面的变量全部用前面定义的值来代替再执行,而ask在整个语句之前没被定义,所以第一次执行到此处时实际是运行if /I "" NEQ "y",所以运行了goto ask。
复合语句中不宜使用标签,一旦goto后就跳出了复合语句,第二次ask的值才会是你定义的值。
你的代码可以开启变量延迟来解决
可在论坛搜索“变量延迟”

TOP

把括号移一下就可以了。
  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
复制代码

TOP

原帖由 zhouyongjun 于 2009-9-14 22:38 发表
你这是个if...else...的复合语句
批处理遇到这样的语句首先要进行预处理,会把里面的变量全部用前面定义的值来代替再执行,而ask在整个语句之前没被定义,所以第一次执行到此处时实际是运行if /I "" NEQ "y",所以运 ...


给个解决方案,谢谢!

TOP

懒得看了..根据2楼的意思是加个setlocal enabledelayedexpansion么?

TOP

呵,我的感觉。
不要把简单的问题复杂化。在if 内部加goto. 或在for 内部加goto .本身就是很不规范的写法。
应尽力避免的。

TOP

返回列表