
寫了一個(gè)延遲函數(shù)發(fā)現(xiàn)一個(gè)奇怪的問題想著像c那樣格式寫批處理程序,就把原來的延時(shí)函數(shù)修改了一下,加入變量延遲稍微修改一下
剛開始修改的時(shí)候沒注意,沒有修改time的引用格式,還是%time%,,奇怪的是這樣也準(zhǔn)確執(zhí)行了延時(shí)命令。我的理解是函數(shù)體被括號(hào)括起來之后,整個(gè)函數(shù)體作為一個(gè)語(yǔ)句塊,不開啟變量延遲的情況下,整個(gè)函數(shù)體執(zhí)行之前已經(jīng)賦值變量%time%,所以上邊的代碼中dtime應(yīng)該一直為0的,會(huì)導(dǎo)致這個(gè)這個(gè)函數(shù)一直循環(huán)下去。。奇葩的是這種情況下準(zhǔn)確執(zhí)行了這個(gè)延時(shí)命令。后來調(diào)試了一下,發(fā)現(xiàn)括號(hào)內(nèi)引用%time%的值是變化的。nclick="copycode($('code0'));">復(fù)制代碼
- :delay <millisec> 精確度10毫秒
- (
- @echo off&setlocal enabledelayedexpansion&set totalTime=0
- if %1== goto :eof
- for /F tokens=3,4 delims=.: %%a in (!time!) do (set /a n=10%%a%%100*1000+10%%b%%100*10)
- :begin
- for /F tokens=3,4 delims=.: %%a in (!time!) do (set /a dtime=10%%a%%100*1000+10%%b%%100*10-n,n=10%%a%%100*1000+10%%b%%100*10)
- set /a totalTime+=!dtime:-=60000-!
- if %totalTime% lss %~1 goto :begin
- endlocal&goto :eof
- )
上邊兩次輸出的時(shí)間是變化的,難道作為環(huán)境變量,%time%比較特殊?又專門測(cè)試了一下是不是這個(gè)%time%在開啟變量延遲下的區(qū)別nclick="copycode($('code1'));">復(fù)制代碼
- @echo off
- delay 3000
- pause&exit
- :delay <millisec> 精確度10毫秒
- (
- @echo off&setlocal enabledelayedexpansion&set totalTime=0
- if %1== goto :eof
- for /F tokens=3,4 delims=.: %%a in (%time%) do (set /a n=10%%a%%100*1000+10%%b%%100*10)
- echo %time%
- :begin
- for /F tokens=3,4 delims=.: %%a in (%time%) do (set /a dtime=10%%a%%100*1000+10%%b%%100*10-n,n=10%%a%%100*1000+10%%b%%100*10)
- set /a totalTime+=!dtime:-=60000-!
- if %totalTime% lss %~1 goto :begin
- echo %time%
- endlocal&goto :eof
- )
執(zhí)行結(jié)果:nclick="copycode($('code2'));">復(fù)制代碼
- @echo off
- echo 測(cè)試
- (
- setlocal enabledelayedexpansion
- for /L %%i in (1,1,3) do (
- echo !time!
- echo %time%
- echo/
- call :delay 780
- )
- call :delay 2000
- echo 延時(shí)2s之后:
- for /L %%i in (1,1,3) do (
- echo !time!
- echo %time%
- echo/
- call :delay 780
- )
- endlocal
- )
- pause&exit
這樣測(cè)試在開啟變量延遲的情況下,同一個(gè)語(yǔ)句塊里邊,%time%這樣引用值是不變的,只有!time!引用才可以得到實(shí)時(shí)的time值。那么問題來了,在這個(gè)延時(shí)函數(shù)里邊,錯(cuò)寫成%time%的時(shí)候?yàn)槭裁纯梢哉_執(zhí)行,%time%也可以得到正確的值,半天沒搞明白。nclick="copycode($('code3'));">復(fù)制代碼
- 測(cè)試
- 10:55:55.52
- 10:55:55.52
- 10:55:56.30
- 10:55:55.52
- 10:55:57.08
- 10:55:55.52
- 延時(shí)2s之后:
- 10:55:59.86
- 10:55:55.52
- 10:55:00.64
- 10:55:55.52
- 10:55:01.42
- 10:55:55.52

