中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 我做的自动倒计退出 上一主题 | 下一主题
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『楼 主』:  我做的自动倒计退出

我参考了网上的资料做了个自动倒计退出代码如下:
@echo off
set t=5
set a=1

:EX
cls
color 2F
echo ---------------------------------------------
echo.       
echo         %t%秒后自动退出......
echo.
echo ---------------------------------------------
call :ProcDelay EX0
:EX0
set /a t=%t%-%a%
if %t% GTR 0 goto EX
@exit


:ProcDelay delayMSec_
setlocal enableextensions
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
  :_procwaitloop
  for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
  set /a diff_=%now_%-%start_%
if %diff_% LSS 100 goto _procwaitloop
endlocal & goto %1



很成功,5秒后知道退出,并且能够倒计时的
但我想问问在这代码里能否简化呢?
能否简化掉 :EX0 这呢,这里要用goto才能用很麻烦。

还有里面的

setlocal enableextensions
..................
endlocal

这标志有什么用?能说明一下吗?

2006-6-7 17:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 2 楼』:  

这是你自己做的???呵呵,我想是贴人家的代码吧,willsort的延时批处理可就有这段代码,呵呵,唉,setlocal enableextensions这个是启用命令处理器扩展名,而endlocal就是结束他的使用范围了,endlocal如果出现批处理的末端没有多大意义,默认的就会执行endlocal语句了

2006-6-7 17:39
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 3 楼』:  

:ProcDelay delayMSec_
setlocal enableextensions
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
  :_procwaitloop
  for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
  set /a diff_=%now_%-%start_%
if %diff_% LSS 100 goto _procwaitloop
endlocal & goto %1

这个是改了一下人家代码。

我想知道的是前面的代码能否精简,特别不想用goto来自动显示倒计。



在程序里call了之后是否返回使用call的地方(父批处理程序)?

[ Last edited by austion on 2006-6-7 at 18:47 ]

2006-6-7 17:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 4 楼』:  

有个只有509字节的延时程序的Wait ,不过在CMD命令行下运行后跳转command模式了。

2006-6-8 22:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  

Re austion:

      楼主可能尚未掌握 call :label 的用法,与 call program.bat 类似,它在根据标签调用了批处理自身的一段代码后会自主返回 call 语句之后,不需要你在 :ProcDelay 结束后 goto 跳转而回,所以也就不需要 ex0 标签和相对应的命令行参数了。

Re bagpipe:

      在程序末端使用 endlocal 有时候是有用的,比如它可以用来保留 setlocal/endlocal 之间所作的环境变量修改。具体信息参见[1]。

Re fastslz:

      跳转command模式是因为它是16位MZ格式程序,而使用32位的PE程序则不会出现此问题。

      在[2]中提到了Herbert Kleebauer 的 sleep.bat ,用它可以直接生成 sleep.exe 程序,因为此程序同时具有16位MZ模块和32位PE模块,所以它是可以同时运行在DOS和Windows命令行的“两栖”程序。它的大小是1024字节,这是PE格式的最低极限。

[1] 提取文件逐行內容,進行運算 問題! 麻煩高手解答.!
http://www.cn-dos.net/forum/viewthread.php?tid=21075#pid126083

[2] 批处理编程的异类——时钟(Clock)
http://www.cn-dos.net/forum/viewthread.php?tid=8905#pid54227



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-9 02:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 6 楼』:  

谢谢5楼的解答不过按照你那么说那么我的就可以做成了:

@echo off
set t=5
set a=1

:EX
cls
color 2F
echo ---------------------------------------------
echo.        
echo         %t%秒后自动退出......
echo.
echo ---------------------------------------------
call :ProcDelay
set /a t=%t%-%a%
if %t% GTR 0 goto EX
@exit


:ProcDelay
setlocal enableextensions
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
  :_procwaitloop
  for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
  set /a diff_=%now_%-%start_%
if %diff_% LSS 100 goto _procwaitloop
endlocal



在这段代码当中的确运行没什么问题,一切如常。
但是要是 :ProcDelay 这段代码不是放在最后的话,后面还有代码那问题就出来了,
他会执行玩 :ProcDelay 后不是反回父批处理程序,而是执行下面的代码了。
这可是问题啊。

2006-6-10 01:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: