中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 04:16
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了? 查看 1,246 回复 7
楼 主 [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了? 发表于 2007-04-26 11:53 ·  中国 广东 广州 鹏博士宽带
初级用户
★★
积分 176
发帖 78
注册 2007-04-15 10:53
19年会员
UID 85268
性别 男
状态 离线
代码如下,请高手帮忙分析下……切盼


  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 ]
2 发表于 2007-04-26 12:06 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
在mshta下面加一个goto :EOF试试。
3 发表于 2007-04-27 02:59 ·  中国 广东 广州 鹏博士宽带
初级用户
★★
积分 176
发帖 78
注册 2007-04-15 10:53
19年会员
UID 85268
性别 男
状态 离线
谢lxmxn版主的回答,在mshta下面加goto :EOF,会出错,加在:out下面还是会循环回去。
4 发表于 2007-04-27 03:55 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
修改一下:

@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
5 发表于 2007-04-27 07:35 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
21年会员
UID 44210
状态 离线
在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 ]
6 发表于 2007-04-29 05:20 ·  中国 广东 广州 鹏博士宽带
初级用户
★★
积分 176
发帖 78
注册 2007-04-15 10:53
19年会员
UID 85268
性别 男
状态 离线
谢谢楼上两位的回答,又学到两样东西。因为这两天有点事所以看得慢了请见谅,再请教下,帮助文件里对于goto :eof 是这样说明的:

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

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

[ Last edited by Vampire on 2007-4-28 at 04:27 PM ]
7 发表于 2007-09-13 17:37 ·  中国 北京 鹏博士BGP
初级用户
积分 66
发帖 29
注册 2007-09-06 15:09
18年会员
UID 96715
性别 男
状态 离线
分析一下,感觉楼主的代码在:sonud 那里 goto回loop好像不对,因为这时候sonud这个子过程还没有结束。直到最后temp的值为空,才到了out那里,这时候最后一次sound才结束,然后,就一个一个退回去了。

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

不知道说的对不对。

[ Last edited by flamemperor on 2007-9-13 at 05:58 PM ]
8 发表于 2008-07-21 19:14 ·  中国 广西 南宁 马山县 电信
初级用户
★★
积分 176
发帖 78
注册 2007-04-15 10:53
19年会员
UID 85268
性别 男
状态 离线
楼上正解……
论坛跳转: