![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-08 15:53 |
共 47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [结贴]一个bat中的变量延迟问题 |
| 可打印版本 978 / 9 |
| 第1楼 learner0 | 发表于 2008-04-23 14:44 |
| 初级用户 发帖 49 积分 108 | |
|
[结贴]一个bat中的变量延迟问题 请大家分别测试以下三段代码:
::一: @echo off color f2 set n=0 :cir rem wmic process call create cmd echo %cd% %cmdcmdline% set /a n+=1 if %n%==16 ( set /p m=Please choose: if /i "%m%" equ "y" ( exit/B ) else ( msg console /time:2 "继续循环下去"&goto cir ) ) else goto cir ::二 @echo off set n=0 for /l %%i in (1,1,26) do call :cir %%i goto :eof :end pause goto :eof :cir echo. set /p= %random:~1% <nul set /a n+=1 if %n%==16 ( set /p m=Please choose 'y' to exit,or press 'n' go on: if "%m%" equ "y" ( ::goto :eof ::exit /b call :end ) else ( msg console /time:2 "继续循环下去"&goto cir ) ) else ( rem 如果n等于19便退出程序。 if %n% equ 19 exit goto cir ) goto :eof ::三 @echo off set n=0 set m= pause :cir echo. set /P= %random% <nul set /a n+=1 if %n%==16 ( set /p=%0<nul if defined m (echo INit............&pause ) else echo\&echo Over...........................&echo.&pause ) else goto cir [ Last edited by learner0 on 2008-4-24 at 03:07 PM ] |
|
| 第2楼 learner0 | 发表于 2008-04-23 15:41 |
| 初级用户 发帖 49 积分 108 | |
|
对于一和二两个bat,不管你输入y还是n,msg对会执行,why??
怎么没有一个人回帖,偶没时间在线啦...-__- [ Last edited by learner0 on 2008-4-23 at 03:48 PM ] |
|
| 第3楼 plp626 | 发表于 2008-04-23 15:44 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
先加个分,楼主探索精神可佳,我正在测试,
|
|
| 第4楼 plp626 | 发表于 2008-04-23 15:50 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
我没看懂要表达什么,
你说的bug指的是什么? |
|
| 第5楼 learner0 | 发表于 2008-04-23 21:20 |
| 初级用户 发帖 49 积分 108 | |
|
对于一bat不管if语句的条件是否成立,msg都会执行,
即从if %n%==16的条件不成立时,他就开始执行。。。 对于二bat,不管你输入y还是n, msg都会执行,并且输入y时,call :end未被执行.... [ Last edited by learner0 on 2008-4-24 at 12:41 PM ] |
|
| 第6楼 junchen2 | 发表于 2008-04-23 21:40 |
| 高级用户 发帖 219 积分 537 来自 杭州--半山 | |
|
setlocal enabledelayedexpansion
在小括号里面记得设置变量延迟。 if/i "%m%" equ "y" 改成if /i "!m!" equ "y" |
|
| 第7楼 learner0 | 发表于 2008-04-24 12:48 |
| 初级用户 发帖 49 积分 108 | |
|
根本就不是变量延迟的问题,请多测试该代码,bug问题如我第五楼所说...
抱歉,我没有电脑,因此很难及时与大家交流.... |
|
| 第8楼 dikex | 发表于 2008-04-24 13:23 |
| 高级用户 发帖 366 积分 788 | |
|
对于一
不是msg的错,是你的书写不太规范导致的: if/i "%m%" equ "y" ( exit/B “if” 和“/i” 之间加个空格 可以把msg改为echo看看效果,一样是满屏 "继续循环下去" 另外如6楼所说,这个代码需要有变量延迟 |
|
| 第9楼 dikex | 发表于 2008-04-24 13:40 |
| 高级用户 发帖 366 积分 788 | |
|
“二”看起来思路有点混乱,不知代码是干嘛的-_-
首先,还是变量延迟的问题; 第二,当n 等于16,提示输入时,按了Y,接着call :end,但之后遇到goto :eof 又返那堆IF那里了…… 第三,如那时按了非“Y”,接着goto cir,n 继续增加,之后不可能等于16了,直至等于19时结束,这段时间在空转浪费资源,而且exit 后面还有个goto cir,这个goto变成废物了 |
|
| 第10楼 learner0 | 发表于 2008-04-24 14:08 |
| 初级用户 发帖 49 积分 108 | |
|
谢谢楼上两位大哥的指点,问题的确是出在变量延迟上。。。
原程序修改后如下,毫无bug: @echo off color f2 set n=0 :cir rem wmic process call create cmd echo %cd% %cmdcmdline% set /a n+=1 if %n%==16 ( setlocal enabledelayedexpansion set /p m=Please choose: if /i "!m!" equ "y" ( exit/B ) else ( msg console /time:2 "继续循环下去"&goto cir ) ) else goto cir ::二 @echo off set n=0 for /l %%i in (1,1,26) do call :cir %%i goto :eof :end pause goto :eof :cir echo. set /p= %random:~1% <nul set /a n+=1 if %n%==16 ( setlocal enabledelayedexpansion set /p m=Please choose 'y' to exit,or press 'n' go on: if "!m!" equ "y" ( ::此处是从一个子过程调用另外一个子过程。 call :end ) else ( msg console /time:2 "继续循环下去"&goto cir ) ) else ( rem 如果n等于19便退出程序。 if %n% equ 19 exit goto cir ) goto :eof [ Last edited by learner0 on 2008-4-24 at 02:56 PM ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |