中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 19:03
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理延时还有什么精巧点的技巧吗?
楼 主 批处理延时还有什么精巧点的技巧吗? 发表于 2006-09-29 07:08 ·  中国 重庆 合川区 电信
初级用户
积分 126
发帖 38
注册 2006-09-26 20:39
UID 63726
状态 离线
ping -n这个可实现延时,但是我认得这不是一个好办法,因为我查看了一下CPU的使用情况,ping时已经达到50%,一个延时都这样了,还搞什么程序?
2 发表于 2006-09-29 07:41 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
可以变通一下,用 at
3 发表于 2006-09-29 07:47 ·  中国 重庆 合川区 电信
初级用户
积分 126
发帖 38
注册 2006-09-26 20:39
UID 63726
状态 离线
at好像需要服务的支持,现在许多机器优化了后都没开这个服务
4 发表于 2006-09-29 07:54 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
Originally posted by nvflash at 2006-9-29 07:47:
at好像需要服务的支持,现在许多机器优化了后都没开这个服务

你在自己的虮子上开就是了哦~要是想在别人的虮子上开可以执行下面的开启哦

sc config schedule start= auto
sc start schedule
5 发表于 2006-09-29 08:17 ·  中国 重庆 合川区 电信
初级用户
积分 126
发帖 38
注册 2006-09-26 20:39
UID 63726
状态 离线
如果您说是是任务计划的话,我已经没信心了,我用多种方式试过多次任务计划,都莫名奇妙的没有正确执行,这东西不太稳当,我看还是不用这个好
6 发表于 2006-09-29 08:19 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
呵呵,建议你搜索 "延时" 以前讨论过好多的
7 发表于 2006-09-29 08:48 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
批处理延时方法小结:
1.ping

@echo off
:loop
echo %time%
ping 127.1 -n 2 1>nul
echo %time%
goto loop


内存使用: cmd.exe 1704k
ping.exe 2920k
误差评定: 较高
优点: 代码构造简单
缺点: 内存占用高,延迟时间长的话误差相对较大。


2.还是ping

@echo off
:loop
echo %time%
ping 1 -n 1 -w 1000 2>nul 1>nul
echo %time%
goto loop

内存使用: cmd.exe 1700k
ping.exe 2912k
误差评定: 一般
优点: 代码构造简单,时间越长误差越小,精确度较高(50ms)
缺点: 内存占用高


3.call

@echo off
:loop
echo %time%
call :delay 1000
echo %time%
goto loop

:delay
set /a num=num + 1
if %num% geq %1 (set num=) && goto :eof
rem for /l %%i in (1,1,%1) do echo. >nul
goto :eof

内存使用: cmd.exe 1744k
cmd.exe 1740k
误差评定: 很高 (受CPU频率影响非常大,几乎无法准确把握全局延迟时间)
优点: 精确度较高
缺点: 不适合需精确把握时间的场合

4.msg

@echo off
:loop
echo %time%
msg %username% /time:20 /w "正在延时,点确定可以取消延时!"
echo %time%
goto loop


内存使用: cmd.exe 1752k
msg.exe 2620k
误差评定: 低
优点: 比较稳定,可中途取消延时,代码构造简单
缺点: 内存占用非常大,有窗口弹出(优点?缺点?)

5.vbs

@echo off
echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
:loop
echo %time%
cscript //b //nologo %tmp%\delay.vbs 2000
echo %time%
goto loop

内存使用: cscript.exe 4812k
cmd.exe 1708k
误差评定: 很低
优点: 精确度最高,使用更灵活,方便
缺点: 产生临时文件,内存占用多


End:
1.测试条件有限,以上数据并不具备权威性。
2.关于精确度。
其实只要是参数可以指定时间的命令精确度都比较高,之所以受影响是取决与命令执行的次数,次数越多,精确度越低。而方案5中之所以说它的精确度最高,可以举个例子: cscript //b //nologo delay.vbs 2036,而方案二由于最小精确度的缘故,还是比方案5要差一点。
3.欢迎大家补充。
参考链接:
1.从一个GIF文件引起的麻烦
2.批处理编程的异类


[ Last edited by 3742668 on 2006-9-29 at 08:49 ]
8 发表于 2006-09-29 08:49 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
能讲一下你为什么要延时操作?
9 发表于 2006-09-29 09:11 ·  中国 重庆 合川区 电信
初级用户
积分 126
发帖 38
注册 2006-09-26 20:39
UID 63726
状态 离线
请问版主,除了%time%以外,还有哪些是系统内置的变量?
10 发表于 2006-09-29 09:14 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
Originally posted by nvflash at 2006-9-29 09:11:
请问版主,除了%time%以外,还有哪些是系统内置的变量?

1.运行不带参数的命令set
2.运行命令set /?,末尾。
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
+1 2010-01-27 09:13
newborenee +1 2010-03-10 22:14
11 发表于 2006-11-03 12:40 ·  中国 上海 虹口区 电信
高级用户
★★
积分 653
发帖 252
注册 2006-04-16 19:48
UID 53939
状态 离线
推荐一个标准 posix 命令:sleep,例如:

睡 10 秒
sleep 10s

1分钟
sleep 1m

2小时
sleep 2h

5天:
sleep 5d

附件是 sleep 的 win32 版,对于需要到处传播的批处理来说可能不太方便。自己用的话还是不错的。
附件
sleep.rar (7.57 KiB, 下载附件所需积分 1 点, 下载次数: 381)
12 发表于 2006-11-03 23:43 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

  呵呵,多谢楼上又提供了一个延时的小工具,下载来试试~~

  记得还有一个工具,叫sleepx,它可以精确到毫秒,不知道这个sleep有没有比较高的精确度哈~~
13 发表于 2006-11-04 04:25 ·  中国 上海 杨浦区 电信
高级用户
★★
积分 653
发帖 252
注册 2006-04-16 19:48
UID 53939
状态 离线
Originally posted by lxmxn at 2006-11-3 23:43:

  呵呵,多谢楼上又提供了一个延时的小工具,下载来试试~~

  记得还有一个工具,叫sleepx,它可以精确到毫秒,不知道这个sle ...


呵呵,在 win32 下面,除了用API:timeSetEvent,其它手段很难做到精确的毫秒级延迟(虽然 Performance Counter 也可以,但是CPU耗用率过高)。

timeSetEvent 会在系统全局范围改变时间片粒度,对系统性能也有一点影响。兄台如果觉得真的有必要的话,俺可以写一个
14 发表于 2006-12-26 07:40 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
UID 74129
性别 男
状态 离线
这个好啊
支持
15 用 goto和set 来做延时 发表于 2006-12-26 19:20 ·  新西兰 奥克兰大区 奥克兰 Microsoft
高级用户
★★
积分 783
发帖 268
注册 2006-12-26 17:18
UID 74627
性别 男
状态 离线
@echo off
echo 当前秒数:%time:~6,-3%
set /p dalay="输入60以内延迟秒数:"%dalay%
:compte
if not %dalay%==%time:~6,-3% goto compte
echo 时间到!!买单!
pause>nul
论坛跳转: