中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [结贴]一个bat中的变量延迟问题
作者:
标题: [结贴]一个bat中的变量延迟问题 上一主题 | 下一主题
learner0
初级用户





积分 108
发帖 49
注册 2008-2-26
状态 离线
『楼 主』:  [结贴]一个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[y/n]:
  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[y/n]:
   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 ]

   此帖被 +3 点积分     点击查看详情   
评分人:【 plp626 分数: +3  时间:2008-4-23 15:45


2008-4-23 14:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
learner0
初级用户





积分 108
发帖 49
注册 2008-2-26
状态 离线
『第 2 楼』:  

对于一和二两个bat,不管你输入y还是n,msg对会执行,why??

怎么没有一个人回帖,偶没时间在线啦...-__-

[ Last edited by learner0 on 2008-4-23 at 03:48 PM ]

2008-4-23 15:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 3 楼』:  

先加个分,楼主探索精神可佳,我正在测试,



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-23 15:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 4 楼』:  

我没看懂要表达什么,
你说的bug指的是什么?



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-23 15:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
learner0
初级用户





积分 108
发帖 49
注册 2008-2-26
状态 离线
『第 5 楼』:  

对于一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 ]

2008-4-23 21:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
junchen2
高级用户





积分 537
发帖 219
注册 2007-8-4
来自 杭州--半山
状态 离线
『第 6 楼』:  

setlocal enabledelayedexpansion
在小括号里面记得设置变量延迟。

if/i "%m%" equ "y"  改成if /i "!m!" equ "y"

   此帖被 +2 点积分    点击查看详情   
评分人:【 learner0 分数: +2  时间:2008-4-24 14:59


2008-4-23 21:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
learner0
初级用户





积分 108
发帖 49
注册 2008-2-26
状态 离线
『第 7 楼』:  

根本就不是变量延迟的问题,请多测试该代码,bug问题如我第五楼所说...

抱歉,我没有电脑,因此很难及时与大家交流....

2008-4-24 12:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 8 楼』:  

对于一

不是msg的错,是你的书写不太规范导致的:
if/i "%m%" equ "y" ( exit/B
“if” 和“/i” 之间加个空格

可以把msg改为echo看看效果,一样是满屏 "继续循环下去"
@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[y/n]:
  if/i "%m%" equ "y" ( exit/B        
  ) else ( echo "继续循环下去"&goto cir )
) else goto cir
另外如6楼所说,这个代码需要有变量延迟

   此帖被 +2 点积分    点击查看详情   
评分人:【 learner0 分数: +2  时间:2008-4-24 15:00




正在潜水修练的批处理小白
2008-4-24 13:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 9 楼』:  

“二”看起来思路有点混乱,不知代码是干嘛的-_-

首先,还是变量延迟的问题;
第二,当n 等于16,提示输入时,按了Y,接着call :end,但之后遇到goto :eof 又返那堆IF那里了……
第三,如那时按了非“Y”,接着goto cir,n 继续增加,之后不可能等于16了,直至等于19时结束,这段时间在空转浪费资源,而且exit 后面还有个goto cir,这个goto变成废物了



正在潜水修练的批处理小白
2008-4-24 13:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
learner0
初级用户





积分 108
发帖 49
注册 2008-2-26
状态 离线
『第 10 楼』:  

谢谢楼上两位大哥的指点,问题的确是出在变量延迟上。。。
原程序修改后如下,毫无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[y/n]:
  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[y/n]:
   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 ]

2008-4-24 14:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: