![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-23 16:49 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,274 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 我做的自动倒计退出 |
| 可打印版本 1,393 / 5 |
| 第1楼 austion | 发表于 2006-06-07 17:05 |
| 初级用户 发帖 82 积分 178 | |
|
我做的自动倒计退出 我参考了网上的资料做了个自动倒计退出代码如下:
@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 这标志有什么用?能说明一下吗? |
|
| 第2楼 bagpipe | 发表于 2006-06-07 17:39 |
| 银牌会员 发帖 425 积分 1,144 来自 北京 | |
|
这是你自己做的???呵呵,我想是贴人家的代码吧,willsort的延时批处理可就有这段代码,呵呵,唉,setlocal enableextensions这个是启用命令处理器扩展名,而endlocal就是结束他的使用范围了,endlocal如果出现批处理的末端没有多大意义,默认的就会执行endlocal语句了
|
|
| 第3楼 austion | 发表于 2006-06-07 17:47 |
| 初级用户 发帖 82 积分 178 | |
|
: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 ] |
|
| 第4楼 fastslz | 发表于 2006-06-08 22:03 |
| 铂金会员 发帖 2,315 积分 5,493 来自 上海 | |
|
有个只有509字节的延时程序的Wait ,不过在CMD命令行下运行后跳转command模式了。
|
|
| 第5楼 willsort | 发表于 2006-06-09 02:54 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re austion:
楼主可能尚未掌握 call :label 的用法,与 call program.bat 类似,它在根据标签调用了批处理自身的一段代码后会自主返回 call 语句之后,不需要你在 :ProcDelay 结束后 goto 跳转而回,所以也就不需要 ex0 标签和相对应的命令行参数了。 Re bagpipe: 在程序末端使用 endlocal 有时候是有用的,比如它可以用来保留 setlocal/endlocal 之间所作的环境变量修改。具体信息参见。 Re fastslz: 跳转command模式是因为它是16位MZ格式程序,而使用32位的PE程序则不会出现此问题。 在中提到了Herbert Kleebauer 的 sleep.bat ,用它可以直接生成 sleep.exe 程序,因为此程序同时具有16位MZ模块和32位PE模块,所以它是可以同时运行在DOS和Windows命令行的“两栖”程序。它的大小是1024字节,这是PE格式的最低极限。 提取文件逐行內容,進行運算 問題! 麻煩高手解答.! http://www.cn-dos.net/forum/viewthread.php?tid=21075#pid126083 批处理编程的异类——时钟(Clock) http://www.cn-dos.net/forum/viewthread.php?tid=8905#pid54227 |
|
| 第6楼 austion | 发表于 2006-06-10 01:35 |
| 初级用户 发帖 82 积分 178 | |
|
谢谢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 后不是反回父批处理程序,而是执行下面的代码了。 这可是问题啊。 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |