首页 电脑 电脑学堂 查看内容

完美的批处理Sleep

2011-4-11 15:38 707 0

摘要:   我以前写脚本遇到需要Sleep的地方都是借助于ping来实现,因为Windows的ping在发每个包之间都会调用KERNEL32!Sleep来挂起1秒钟。最有意思的是在给Sleep传递参数的时候还...
关键词: nbsp Sleep ping EnableExtensions 往返 procwaitloop 精确 esi ProcDelay eax

  我以前写脚本遇到需要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
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部