完美的Dos批处理实现sleep

转来一片文章,今天用到了才去查,放在这里,以后要时常翻翻看。
 
完美的批处理Sleep
2007-03-23 09:45

作者:tombkeeper[Base64Decode("dG9tYmtlZXBlckB4Zm9jdXMub3Jn")]
出处:http://hi.baidu.com/tombkeeper
时间:2007.03.23

我以前写脚本遇到需要Sleep的地方都是借助于ping来实现,因为Windows的ping在发每个包之间都会调用KERNEL32!Sleep来挂起1秒钟。最有意思的是在给Sleep传递参数的时候还会扣掉通信往返所花的时间,所以非常精确。这部分反汇编出来是这样的:

010020fe b8e8030000         mov        eax,3E8h       ;1000ms
01002103 8b7608             mov        esi,dword ptr [esi+8] ;取出icmp包往返所花的时间
01002106 3bf0               cmp        esi,eax     ;ping 127.0.0.1当然不会超过1000ms
01002108 7309               jae        ping+0x2113 (01002113)
0100210a 2bc6               sub        eax,esi ;减去通信耗时
0100210c 50                 push       eax
0100210d ff1528100001       call       KERNEL32!Sleep

假设需要Sleep 10秒,就可以这样写:

SET SLEEP=ping 127.0.0.1 -n
%SLEEP% 11 > nul

不过前几天我看到了更奇的办法,不依赖任何外部命令,纯用批处理实现Sleep,能精确到0.01秒,可惜已经无法考证出原始作者了。这是个2秒的例子:

@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值