中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了?
作者:
标题: [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了? 上一主题 | 下一主题
Vampire
初级用户





积分 176
发帖 78
注册 2007-4-15
状态 离线
『楼 主』:  [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了?

代码如下,请高手帮忙分析下……切盼

  Quote:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. color 0e
  4. mode con lines=20 cols=60
  5. set count=-1
  6. set a=今天又是健康、快乐、积极、进步的一天,抬起头呀嘛哦嘿,向前走呀嘛哦嘿……     ——呼吸新世界
  7. :loop
  8. set /a count+=1
  9. call set temp=%%a:~!count!,1%%
  10. if "%temp%"=="" (
  11.         goto out       
  12. ) else (
  13.         call set /p=%%a:~!count!,1%%<nul
  14.         call :sound "%temp%"
  15. )
  16. :sound
  17. mshta vbscript:createobject("sapi.spvoice").speak(%1)(window.close)
  18. goto loop
  19. :out
  20. echo.
  21. pause>nul
        Vampire发表于:  2007-04-25  22:41

[ Last edited by Vampire on 2007-4-25 at 11:03 PM ]

2007-4-26 11:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

在mshta下面加一个goto :EOF试试。

2007-4-26 12:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Vampire
初级用户





积分 176
发帖 78
注册 2007-4-15
状态 离线
『第 3 楼』:  

谢lxmxn版主的回答,在mshta下面加goto :EOF,会出错,加在:out下面还是会循环回去。

2007-4-27 02:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

修改一下:
@echo off
setlocal enabledelayedexpansion
color 0e
mode con lines=20 cols=60
set count=-1
set a=今天又是健康、快乐、积极、进步的一天,抬起头呀嘛哦嘿,向前走呀嘛哦嘿……     ——呼吸新世界
:loop
set /a count+=1
call set temp=%%a:~!count!,1%%
if "%temp%"=="" (
        goto out        
) else (
        call set /p=%%a:~!count!,1%%<nul
        call :sound "%temp%"
)
goto loop
:sound
mshta vbscript:createobject("sapi.spvoice").speak(%1)(window.close)
goto :eof
:out
echo.
pause>nul


2007-4-27 03:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 5 楼』:  

在goto的循环中只要不被“()”,或“&”同行,可以不用延迟变量:call set temp=%%a:~%count%,1%%

简化之:
@echo off
color 0e
mode con lines=20 cols=60
set count=0
set a=今天又是健康、快乐、积极、进步的一天,抬起头呀嘛哦嘿,向前走呀嘛哦嘿……     ——呼吸新世界
:loop
call set temp=%%a:~%count%,1%%
set /p=%temp%<nul&call :sound "%temp%"&set /a count+=1
if not "%temp%"=="" goto loop
pause>nul
exit

:sound
mshta vbscript:createobject("sapi.spvoice").speak(%1)(window.close)
goto :eof
[ Last edited by zh159 on 2007-4-26 at 06:38 PM ]

2007-4-27 07:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Vampire
初级用户





积分 176
发帖 78
注册 2007-4-15
状态 离线
『第 6 楼』:  

谢谢楼上两位的回答,又学到两样东西。因为这两天有点事所以看得慢了请见谅,再请教下,帮助文件里对于goto :eof 是这样说明的:

  Quote:
如果启用了命令扩展(即默认状态),并且使用带有目标标签为 :EOF 的 goto 命令,则可以在不定义标签的情况下将控制传送到当前批处理脚本文件的末端,然后退出批处理脚本文件。

但为何还可以继续执行循环呢?难道因为它只是一个调用过程,对全局环境的结束没有权限?

[ Last edited by Vampire on 2007-4-28 at 04:27 PM ]

2007-4-29 05:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flamemperor
初级用户





积分 66
发帖 29
注册 2007-9-6
状态 离线
『第 7 楼』:  

分析一下,感觉楼主的代码在:sonud 那里 goto回loop好像不对,因为这时候sonud这个子过程还没有结束。直到最后temp的值为空,才到了out那里,这时候最后一次sound才结束,然后,就一个一个退回去了。

eof只能退出当前子程序吧。

不知道说的对不对。

[ Last edited by flamemperor on 2007-9-13 at 05:58 PM ]

2007-9-13 17:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Vampire
初级用户





积分 176
发帖 78
注册 2007-4-15
状态 离线
『第 8 楼』:  

楼上正解……

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

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


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



论坛跳转: