%TIME%作为批处理文件函数中的输入参数



我有以下批处理函数来计算运行时间。当我发送硬编码的时间字符串(例如tdiff 23:38:27.23 01:26:39.43(时,函数调用有效,但当传递具有时间的变量时,它会出错,如下所示

@echo off
setlocal EnableDelayedExpansion
set startt=%time%
set /p s=Some process ...
call :tdiff startt, %time%
exit /B %ERRORLEVEL%
:tdiff
set startTime=%~1
set endTime=%~2
set "start=!startTime:%time:~8,1%=%%100)*100+1!"   
set "end=!endTime:%time:~8,1%=%%100)*100+1!"
set /A "elap=((((10!end:%time:~2,1%=%%100)*60+1!%%100)-((((10!start:%time:~2,1%=%%100)*60+1!%%100)"
if %elap% LEQ 0 set /A elap+=24*60*60*100
rem Convert elapsed time to HH:MM:SS:CC format:
set /A "cc=elap%%100+100,elap/=100,ss=elap%%60+100,elap/=60,mm=elap%%60+100,hh=elap/60+100"
echo Start Time: %startTime%
echo End Time: %endTime%
echo Elapsed Time: %hh:~1%%time:~2,1%%mm:~1%%time:~2,1%%ss:~1%%time:~8,1%%cc:~1%
exit /B %ERRORLEVEL%

错误

Invalid number.  Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).
0 was unexpected at this time.

Q2:我可以直接在语句set "start=!startTime:%time:~8,1%=%%100)*100+1!"中传递%~1而不必求助于另一个变量startTime吗?

以零开头的数字被视为八进制,"08"one_answers"09"是无效的八进制数字
为了避免这种情况,我在时间的每个部分前面加上"1",然后计算模数100。

Btw。不能将%time%CALL直接使用,因为在某些格式中,时间使用,作为分隔符(如15:44:08,44(
但是,也是一个分隔符。

@echo off
set "t_start=%time%"
ping localhost -n 2 > nul
set "t_end=%time%"
call :calc_diff t_start t_end elapsed
echo %elapsed%
exit /b
:calc_diff
setlocal enabledelayedExpansion
FOR /F "tokens=1-4 delims=:.," %%1 in ("!%1: =0!") DO (
set /a "centiA=(((1%%1-100)*60+(1%%2-100))*60+(1%%3-100))*100+1%%4-100"
)
FOR /F "tokens=1-4 delims=:.," %%1 in ("!%2: =0!") DO (
set /a "centiB=(((1%%1-100)*60+(1%%2-100))*60+(1%%3-100))*100+1%%4-100"
)
(
endlocal 
set /a %3=%centiB% - %centiA%
exit /b
)

最新更新