想着像c那样格式写批处理程序,就把原来的延时函数修改了一下,加入变量延迟稍微修改一下- :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
- )
复制代码 刚开始修改的时候没注意,没有修改time的引用格式,还是%time%,,奇怪的是这样也准确执行了延时命令。
我的理解是函数体被括号括起来之后,整个函数体作为一个语句块,不开启变量延迟的情况下,整个函数体执行之前已经赋值变量%time%,所以上边的代码中dtime应该一直为0的,会导致这个这个函数一直循环下去。。奇葩的是这种情况下准确执行了这个延时命令。后来调试了一下,发现括号内引用%time%的值是变化的。- @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
- )
复制代码 上边两次输出的时间是变化的,
难道作为环境变量,%time%比较特殊?
又专门测试了一下是不是这个%time%在开启变量延迟下的区别- @echo off
- echo 测试
- (
- setlocal enabledelayedexpansion
- for /L %%i in (1,1,3) do (
- echo !time!
- echo %time%
- echo/
- call :delay 780
- )
- call :delay 2000
- echo 延时2s之后:
- for /L %%i in (1,1,3) do (
- echo !time!
- echo %time%
- echo/
- call :delay 780
- )
- endlocal
- )
- pause&exit
复制代码 执行结果:- 测试
- 10:55:55.52
- 10:55:55.52
-
- 10:55:56.30
- 10:55:55.52
-
- 10:55:57.08
- 10:55:55.52
-
- 延时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
复制代码 这样测试在开启变量延迟的情况下,同一个语句块里边,%time%这样引用值是不变的,只有!time!引用才可以得到实时的time值。
那么问题来了,在这个延时函数里边,错写成%time%的时候为什么可以正确执行,%time%也可以得到正确的值,半天没搞明白。 |