找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28602|回复: 5

[文本处理] 批处理if语句嵌套语句执行两次

[复制链接]
发表于 2009-9-14 18:29:23 | 显示全部楼层 |阅读模式
大家好,调试一个简单的批处理程序时遇到一个问题。如下图:

图中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
复制代码
发表于 2009-9-14 22:38:05 | 显示全部楼层
你这是个if...else...的复合语句
批处理遇到这样的语句首先要进行预处理,会把里面的变量全部用前面定义的值来代替再执行,而ask在整个语句之前没被定义,所以第一次执行到此处时实际是运行if /I "" NEQ "y",所以运行了goto ask。
复合语句中不宜使用标签,一旦goto后就跳出了复合语句,第二次ask的值才会是你定义的值。
你的代码可以开启变量延迟来解决
可在论坛搜索“变量延迟”
发表于 2009-9-15 11:42:40 | 显示全部楼层
把括号移一下就可以了。
  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
复制代码
 楼主| 发表于 2009-9-16 15:23:24 | 显示全部楼层
原帖由 zhouyongjun 于 2009-9-14 22:38 发表
你这是个if...else...的复合语句
批处理遇到这样的语句首先要进行预处理,会把里面的变量全部用前面定义的值来代替再执行,而ask在整个语句之前没被定义,所以第一次执行到此处时实际是运行if /I "" NEQ "y",所以运 ...


给个解决方案,谢谢!
发表于 2009-9-20 21:48:43 | 显示全部楼层
懒得看了..根据2楼的意思是加个setlocal enabledelayedexpansion么?
发表于 2009-9-20 23:40:01 | 显示全部楼层
呵,我的感觉。
不要把简单的问题复杂化。在if 内部加goto. 或在for 内部加goto .本身就是很不规范的写法。
应尽力避免的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 10:21 , Processed in 0.025396 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表