完美的批處理Sleep

2021-05-25 19:50:05 字數 1342 閱讀 7008

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

2007.09.04補:windows 2003中新增了timeout命令,功能類似sleep,還可以顯示倒計時。

批處理 sleep處理

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 ovbx2gv0e...

批處理實現sleep

linux的shell裡,提供了sleep命令,參考了不少前輩的帖子,我也用批處理實現了sleep。sleep.bat echo off setlocal echo time call sleep 1 echo time endlocal goto eof sleep setlocal enable...

完美的代價

問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...