Board logo

标题: 批处理延时还有什么精巧点的技巧吗? [打印本页]

作者: nvflash     时间: 2006-9-29 07:08    标题: 批处理延时还有什么精巧点的技巧吗?

ping -n这个可实现延时,但是我认得这不是一个好办法,因为我查看了一下CPU的使用情况,ping时已经达到50%,一个延时都这样了,还搞什么程序?
作者: vkill     时间: 2006-9-29 07:41
可以变通一下,用 at
作者: nvflash     时间: 2006-9-29 07:47
at好像需要服务的支持,现在许多机器优化了后都没开这个服务
作者: vkill     时间: 2006-9-29 07:54


  Quote:
Originally posted by nvflash at 2006-9-29 07:47:
at好像需要服务的支持,现在许多机器优化了后都没开这个服务

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

sc config schedule start= auto
sc start schedule
作者: nvflash     时间: 2006-9-29 08:17
如果您说是是任务计划的话,我已经没信心了,我用多种方式试过多次任务计划,都莫名奇妙的没有正确执行,这东西不太稳当,我看还是不用这个好
作者: vkill     时间: 2006-9-29 08:19
呵呵,建议你搜索 "延时"  以前讨论过好多的
作者: 3742668     时间: 2006-9-29 08:48
批处理延时方法小结:
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  [for语句方案]
               cmd.exe 1740k  [set+goto方案]
误差评定:  很高 (受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[vbs方案]中之所以说它的精确度最高,可以举个例子: cscript //b //nologo delay.vbs 2036,而方案二由于最小精确度的缘故,还是比方案5要差一点。
3.欢迎大家补充。
参考链接:
1.从一个GIF文件引起的麻烦  
2.[讨论]批处理编程的异类


[ Last edited by 3742668 on 2006-9-29 at 08:49 ]
作者: redtek     时间: 2006-9-29 08:49
能讲一下你为什么要延时操作?
作者: nvflash     时间: 2006-9-29 09:11
请问版主,除了%time%以外,还有哪些是系统内置的变量?
作者: 3742668     时间: 2006-9-29 09:14


  Quote:
Originally posted by nvflash at 2006-9-29 09:11:
请问版主,除了%time%以外,还有哪些是系统内置的变量?

1.运行不带参数的命令set
2.运行命令set /?,末尾。
作者: asbai     时间: 2006-11-3 12:40
推荐一个标准 posix 命令:sleep,例如:

睡 10 秒
sleep 10s

1分钟
sleep 1m  

2小时
sleep 2h

5天:
sleep 5d

附件是 sleep 的 win32 版,对于需要到处传播的批处理来说可能不太方便。自己用的话还是不错的。
附件 1: sleep.rar (2006-11-3 12:40, 7.57 K, 下载附件所需积分 1点 ,下载次数: 381)

作者: lxmxn     时间: 2006-11-3 23:43

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

  记得还有一个工具,叫sleepx,它可以精确到毫秒,不知道这个sleep有没有比较高的精确度哈~~

作者: asbai     时间: 2006-11-4 04:25


  Quote:
Originally posted by lxmxn at 2006-11-3 23:43:

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

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

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

timeSetEvent 会在系统全局范围改变时间片粒度,对系统性能也有一点影响。兄台如果觉得真的有必要的话,俺可以写一个
作者: scriptor     时间: 2006-12-26 07:40
这个好啊
支持
作者: PPdos     时间: 2006-12-26 19:20    标题: 用 goto和set 来做延时

@echo off
echo 当前秒数:%time:~6,-3%
set /p dalay="输入60以内延迟秒数:"%dalay%
:compte
if not %dalay%==%time:~6,-3% goto compte
echo 时间到!!买单!
pause>nul
作者: PPdos     时间: 2006-12-26 19:27    标题: 失误了 cup 100% :(

如果用ping空ip的方法 ,是不是可以改变默认数据包大小为 1 字节可用呢?
作者: lp1129     时间: 2007-3-28 02:32
强烈的支持,顶!
作者: stornager     时间: 2007-4-14 04:10
我知道了延时的一大诀窍.谢谢高手啦!!!!
作者: windeshadow     时间: 2007-4-17 01:07
不错
作者: testdamao     时间: 2007-4-17 02:13
谢谢了
作者: flyinspace     时间: 2007-4-17 09:12
WSCRIPT.SLEEP 1000

这个东西有误差的。根据cpu的速率,误差在0.01-0.03秒之间。

这个是经过2000余次的延时500统计中得出的数据。。

假设输出计数用去了0.01秒。。

误差也在 0.02秒间。。
作者: yio     时间: 2007-4-23 05:37    标题: good

good
作者: feixiang9911     时间: 2007-4-23 16:23
顶 我第一次来DOS联盟 学了不少东西 呵呵 看到了很多高手 
希望高手门能多多 指教
作者: sw000521     时间: 2007-5-8 12:34    标题: 谢谢了

了解了不少
作者: dxvyi1     时间: 2007-5-8 14:00
好东西啊,我下来试试
作者: heixingdos     时间: 2007-5-10 13:59
楼主正解
作者: clian76     时间: 2007-5-13 01:34
学习了。
作者: doggy     时间: 2007-5-14 01:39
嗯,今天正好在写批处理,需要用一个延时的程序
是参考PPdos大侠的代码,自己写了一个,能够实现60秒以内的延时处理,嗯,这个误差。。应该说一秒以内吧

随便用用一般就够了

Call :BatchDelay 3
Goto Eof

:BatchDelay
  Set /a delayLen=%1 %% 60
  Set nowtime=%TIME:~6,-3%
  Set /a delayEnd=%nowtime%+%delayLen%
  Set /a delayEnd=%delayEnd% %% 60
:BatchDelay2
  Echo %delayEnd%  %TIME:~6,-3%
  Set nowtime=%TIME:~6,-3%
  If %delayEnd% NEQ %nowtime% Goto :BatchDelay2
  Goto Eof

:Eof
作者: doggy     时间: 2007-5-14 02:06
不好意思,刚才那一段有dos八进制自动转换问题,写的时候没有考虑到,现在修正了~

:BatchDelay
  Set /a delayLen=%1 %% 60
  Set nowtime=%TIME:~6,-3%
  If %nowtime:~0,1% EQU 0 Set nowtime=%nowtime:~-1%
  Set /a delayEnd=%nowtime%+%delayLen%
  Set /a delayEnd=%delayEnd% %% 60
:BatchDelay2
  Set nowtime=%TIME:~6,-3%
  If %nowtime:~0,1% EQU 0 Set nowtime=%nowtime:~-1%
  Echo %delayEnd%  %nowtime%
  If %delayEnd% NEQ %nowtime% Goto :BatchDelay2
  Goto Eof
作者: wunekky     时间: 2007-6-5 20:11
为什么用ping -n 40 127.1>nul 2>nul
在我的电脑上能实现,但用在不能上网的电脑上好像不起作用了?
作者: xdoit     时间: 2007-6-5 23:49
谢谢楼主发贴指导。
作者: qinbuer     时间: 2007-6-6 01:17
飘过,学习了
作者: xionghaijian     时间: 2007-6-7 14:14
顶一下,不然下不了!
作者: wbshu     时间: 2007-6-15 11:59
谢谢了!
作者: tiancaizfy     时间: 2007-6-17 11:47
顶        我延时只用ping    落后啊
作者: lywindly     时间: 2007-6-18 02:02
DING
作者: kanny19801214     时间: 2007-6-18 13:38
不错 学习下 我只想到用PING实现
作者: okmmmyyy     时间: 2007-6-24 22:27
看看.................
作者: recooliu     时间: 2007-6-25 12:01
我也是用PING啊~~~~~
作者: tiger3912     时间: 2007-6-25 13:30
不错,我学习,顶
作者: lijialijia     时间: 2007-6-27 16:00    标题: 看明白了

高手很多终于看明白了
作者: SunRiseBoy     时间: 2007-6-28 20:28
http://www.cn-dos.net/forum/viewthread.php?tid=15752
也是这个延时问题,已经自动锁帖。

在这上传附件。wait 10
附件 1: WAIT.rar (2007-6-28 20:28, 562 bytes,下载次数: 80)

作者: woainiphj     时间: 2007-7-4 17:07    标题: DOS高手们!

大家都是DOS高手.我也不会输的!!1
作者: 000012     时间: 2007-7-26 14:40
感觉都是高手啊--呵呵呵
作者: netwinxp     时间: 2007-7-28 20:25
对于较长时间的延时,担心不准确的话,可以用time /T来取得实际时间
作者: netwinxp     时间: 2007-7-28 20:25
对于较长时间的延时,担心不准确的话,可以用time /T来取得实际时间
作者: 3dnowex     时间: 2007-8-19 16:22
@ECHO OFF
SETLOCAL EnableExtensions
CALL :ProcDelay 200
ECHO %TIME%
GOTO :EOF

: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 %1 GOTO _procwaitloop
ENDLOCAL & GOTO :EOF
:EOF
作者: magnus     时间: 2007-8-24 10:17
因为需要安装了网卡才会自动安装TCP/IP协议,ping工具需要用TCP/IP协议工作。所以在没有网卡的电脑上一般ping不会生效。
作者: aq1986     时间: 2007-10-26 18:26    标题: fds

af
作者: ywjco     时间: 2007-12-3 21:19
:: Sleep.bat - Sleep/Delay/Wait n seconds
:: Herbert Kleebauer(Germany) - 2005/05/29
:: Modified by Will Sort - 2005/06/02
@echo off
echo q | debug>nul
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sleep.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sleep.com
echo T}{z~~@GwkBG@OEKcUt`~}@MqqBsy?seHB~_Phxr?@zAB`LrPEyoDt@Cj?>>sleep.com
echo pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz>>sleep.com
echo LFvAURQ?OYLTQ@@?~QCoOL~RDU@?aU?@{QOq?@}IKuNWpe~FpeQFwH?Vkk>>sleep.com
echo _GSqoCvH{OjeOSeIQRmA@KnEFB?p??mcjNne~B?M??QhetLBgBPHexh@e=>>sleep.com
echo EsOgwTLbLK?sFU`?LDOD@@K@xO?SUudA?_FKJ@N?KD@?UA??O}HCQOQ??R>>sleep.com
echo _OQOL?CLA?CEU?_FU?UAQ?UBD?LOC?ORO?UOL?UOD?OOI?UgL?LOR@YUO?>>sleep.com
echo dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM>>sleep.com
echo QTqrK@kcmSULkPcLOOuLOOFUO?hwDTqOsTdbnTQrrDsdFTlnBTm`lThKcT>>sleep.com
echo @dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH>>sleep.com
echo {zpQpKGk?Jbs?FqokOH{T?jPvP@IQBDFAN?OHROL?Kj??pd~aN?OHROd?G>>sleep.com
echo Q??PGT~B??OC~?ipO?T?~U?p~cUo0x>>sleep.com
sleep.com>sleep.exe

运行这个BAT,可以得到sleep.com及sleep.exe,前者可以在DOS6-7下运行,后者在XP的CMD下可以运行.
作者: luxiao6802     时间: 2007-12-4 22:49
小弟菜鸟 学习了
作者: pqowi     时间: 2007-12-29 18:07
太感谢了
作者: greenworld     时间: 2007-12-30 15:35
choice命令吧,偶觉得比ping好,呵呵
作者: vivai     时间: 2008-1-9 10:57
多谢楼上又提供了一个延时的工具
作者: pinghu     时间: 2008-2-1 21:59
今天收获一个延时工具
作者: cnpsx     时间: 2008-2-28 19:19
谢谢楼主,全网就这个论坛有了
作者: wogan     时间: 2008-3-3 13:56
高手们太厉害了
作者: whq98     时间: 2008-3-4 10:44
下来收藏先!
作者: yuehong     时间: 2008-3-5 21:55
高手们太厉害了 。。。
学习了。。。
作者: jonsonqf     时间: 2008-5-2 01:08
貌似延时太久的话很多都不准了
作者: kflgw93     时间: 2008-5-19 09:17
用工具比较方便
作者: 896376374     时间: 2008-5-19 13:25
呵呵,建议你搜索 "延时"  以前讨论过好多的
作者: lllllll     时间: 2008-8-25 10:24
这个延时功能正需要,太好了
作者: georgema     时间: 2008-9-28 15:52
这个延时功能太好了
作者: hlyw     时间: 2008-10-7 15:10
新人还没搞懂要延时有哪些用处。
作者: mryeke     时间: 2008-10-7 19:57
感谢楼上的无私分享
作者: ceasar128     时间: 2008-10-25 14:43    标题: 好东西,正在担心怎么弄呢

谢谢。好东西。
作者: rzkmssj     时间: 2008-10-27 16:34
我用WScript sleep命令实现在指定时间(ms)内脚本执行暂挂,然后继续运行
如下,延迟5秒的批处理文本,

echo WScript.sleep 5000>>x.vbs
call x.vbs
del x.vbs
作者: rzkmssj     时间: 2008-10-27 16:35
我用WScript sleep命令实现在指定时间(ms)内脚本执行暂挂,然后继续运行
如下,延迟5秒的批处理文本,

echo WScript.sleep 5000>>x.vbs
call x.vbs
del x.vbs
作者: zhaokbk     时间: 2008-11-6 20:05
大家都是DOS高手.我也不会输的
作者: zhaokbk     时间: 2008-11-6 20:09
echo WScript.sleep 1000>1.vbs & call 1.vbs & del 1.vbs
延迟1秒
作者: terxiuz     时间: 2008-11-13 19:26
这个好啊
支持