Board logo

标题: [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了? [打印本页]

作者: Vampire     时间: 2007-4-26 11:53    标题: [为何?]DO……LOOP循环,怎么循环完后倒着循环回去了?

代码如下,请高手帮忙分析下……切盼
  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 ]

作者: lxmxn     时间: 2007-4-26 12:06
在mshta下面加一个goto :EOF试试。

作者: Vampire     时间: 2007-4-27 02:59
谢lxmxn版主的回答,在mshta下面加goto :EOF,会出错,加在:out下面还是会循环回去。

作者: lxmxn     时间: 2007-4-27 03:55
修改一下:
@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

作者: zh159     时间: 2007-4-27 07:35
在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 ]

作者: Vampire     时间: 2007-4-29 05:20
谢谢楼上两位的回答,又学到两样东西。因为这两天有点事所以看得慢了请见谅,再请教下,帮助文件里对于goto :eof 是这样说明的:
如果启用了命令扩展(即默认状态),并且使用带有目标标签为 :EOF 的 goto 命令,则可以在不定义标签的情况下将控制传送到当前批处理脚本文件的末端,然后退出批处理脚本文件。
但为何还可以继续执行循环呢?难道因为它只是一个调用过程,对全局环境的结束没有权限? [ Last edited by Vampire on 2007-4-28 at 04:27 PM ]

作者: flamemperor     时间: 2007-9-13 17:37
分析一下,感觉楼主的代码在:sonud 那里 goto回loop好像不对,因为这时候sonud这个子过程还没有结束。直到最后temp的值为空,才到了out那里,这时候最后一次sound才结束,然后,就一个一个退回去了。 eof只能退出当前子程序吧。 不知道说的对不对。 [ Last edited by flamemperor on 2007-9-13 at 05:58 PM ]

作者: Vampire     时间: 2008-7-21 19:14
楼上正解……