标题: [其他] 写了一个延迟函数,发现一个奇怪的问题。 [打印本页]
作者: qq007 时间: 2017-10-11 11:07 标题: 写了一个延迟函数,发现一个奇怪的问题。
想着像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%也可以得到正确的值,半天没搞明白。
作者: 0000 时间: 2017-10-14 12:30
本帖最后由 0000 于 2017-10-14 12:32 编辑
14: if %totalTime% lss %~1 goto :begin
这样会导致括号跳出(忽略了delay后面的 '(' )- (
- @echo off
- setlocal enabledelayedexpansion
- set a=0
- set n=0
- echo 在括号内
- for /l %%a in (1 1 15) do (
- set /a n+=1
- echo %%n%% = %n% ; ^^!n^^! = !n! ;
- )
- echo 跳出括号(从a=1开始^)
- :tiaochu
- set /a a+=1
- echo %%a%% = %a% ; ^^!a^^! = !a! ;
- if !a! lss 15 goto :tiaochu &rem 跳出
- goto :eof &rem 防止后面的')'报错
- )
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |