中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-10 07:58
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [总结]延时 查看 1,115 回复 5
楼 主 [总结]延时 发表于 2007-11-29 15:44 ·  中国 北京 鹏博士BGP
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
@echo off
::Tested by s11ss 2007-11-29
::参考文章: 批处理编程的异类——时钟(Clock)
::http://www.cn-dos.net/forum/viewthread.php?tid=8905#pid54227 第4楼
setlocal
if "%1" equ "" (
echo 参数一是要使用的方法的序号,参数二是要延迟的毫秒数。
echo 参数一:
echo 1. for+set+if 最精确,但延时稍长一点就很占CPU使用率
echo 2. for+cd. 循环800次大概是1秒
echo 3. vbs:sleep 这个最常用,精确度也行,占CPU使用率较少
echo 4. ping:w+0.0.0.1 ping1次大概是1秒
echo 5. ping:127.0.0.1 较常用,ping1次大概是0.5秒
echo 6. mshta:setTimeout 最烂的方法
echo 例如,使用方法3延迟2秒:
echo %0 3 2000
pause
goto :eof
)
set before=%time%& echo %time% %延时前:这行以前(包括这行)%
call :delay%1 %2 %延时,参数1是要使用的方法的序号,参数2是要延迟的毫秒数%
set after=%time%& echo %time% %延时后:这行以后(包括这行)%

::相当烂的计算实际延迟的算法
set before=%before::=%&set after=%after::=%
set before=%before:.=%&set after=%after:.=%
set/a dif=%after%-%before%
if %dif% lss 100 set dif=00%dif%
if %dif% lss 1000 set dif=0%dif%
echo 实际延迟:%dif:~0,2%.%dif:~-2%秒
::相当烂的计算实际延迟的算法

pause
goto :eof








:delay1 for+set+if 最精确,但延时稍长一点就很占CPU使用率
for /f "tokens=1-4 delims=:." %%h in ("%time%") do set start=%%h%%i%%j%%k
set/a v=%1/10
:dc
for /f "tokens=1-4 delims=:." %%h in ("%time%") do set now=%%h%%i%%j%%k
set/a dif=%now%-%start%
if %dif% LSS %v% goto :dc
goto :eof

:delay2 for+cd. 循环800次大概是1秒
set/a v=%1*800/1000
for /l %%a in (1,1,%v%) do (cd.)
goto :eof

:delay3 vbs:sleep 这个最常用,精确度也行,占CPU使用率较少
set/a v=%1-400
echo WScript.Sleep %v% >t.vbs
cscript //nologo t.vbs&del t.vbs
goto :eof

:delay4 ping:w+0.0.0.1 ping1次大概是1秒
set/a v=%1/1000
for /l %%a in (1,1,%v%) do ping -n 1 -w 200 1>nul
goto :eof

:delay5 ping:127.0.0.1 较常用,ping1次大概是0.5秒
set/a v=%1*2/1000
for /l %%a in (1,1,%v%) do ping -n 1 127.1>nul
goto :eof

:delay6 mshta:setTimeout 最烂的方法
set/a v=%1-1000
mshta javascript:moveTo(screen.width,screen.height);setTimeout('close()',%v%)
goto :eof

:delay7 sleep.exe 涉及第三方工具,不便推广使用
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn +8 2007-11-29 17:55
2 发表于 2007-11-30 02:28 ·  中国 上海 联通
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
倾向于vbs.sleep
3 发表于 2008-11-11 21:04 ·  中国 江苏 无锡 电信
新手上路
积分 8
发帖 8
注册 2008-11-10 20:58
17年会员
UID 130589
性别 男
状态 离线
我也有一个:

rem ----------------------------------------------------------------------------------
rem time delayer bat ,3 secs as an example
rem Purple&Green,2008/09/05
rem use %time% expansion,accuracy:0.01second.
rem FORMAT SENSITIVE - code needed to be changed since %time% may be shown in different formats in different systems



:timeloopBEGIN
set /a delay=100*3
set /a oldt=(%time:~0,1%*10+%time:~1,1%)*60*60*100+(%time:~3,1%*10+%time:~4,1%)*60*100+(%time:~6,1%*10+%time:~7,1%)*100+(%time:~9,1%*10+%time:~10,1%)

:timeloop
set /a delaying=(%time:~0,1%*10+%time:~1,1%)*60*60*100+(%time:~3,1%*10+%time:~4,1%)*60*100+(%time:~6,1%*10+%time:~7,1%)*100+(%time:~9,1%*10+%time:~10,1%) - %oldt%

if /i %delaying% lss %delay% goto timeloop
rem -----------------------------------------------------------------------------------

不知是否能和 delay1 比比精确度呢,呵呵。
4 发表于 2008-11-11 21:18 ·  中国 台湾 中华电信(HiNet)数据中心
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
s11ss大大也得貼個你CPU的總線位數吧,32和64的處理問題處理同樣的問題64有可能只要0.0x秒的
5 发表于 2008-11-11 21:34 ·  中国 江苏 无锡 电信
新手上路
积分 8
发帖 8
注册 2008-11-10 20:58
17年会员
UID 130589
性别 男
状态 离线
很荣幸得到 huahua0919 的点评,我是在自己的电脑上测试比较过 s11s 的方法的,虽然有误差,但还是尽量在相同的条件下。

我没有对s11s不敬的意思。

最后要说 cn-dos很有气氛。
6 发表于 2008-11-11 22:25 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
都喜欢挖坟,都多少年前的帖子了

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
论坛跳转: