0

我正在使用 Windows 8 并想编写 bat 文件来记录任务运行的时间。所以我写这个:

@echo off
setlocal

SET STARTTIME=%TIME%

.....do sth. smart.....

SET ENDTIME=%TIME%
SET /A DURATION=%ENDTIME%-%STARTTIME%
SET /A DURATIONH=%DURATION%/360000
SET /A DURATIONM=(%DURATION%-%DURATIONH%*360000)/6000
SET /A DURATIONS=(%DURATION%-%DURATIONH%*360000-%DURATIONM%*6000)/100
SET /A DURATIONHS=(%DURATION%-%DURATIONH%*360000-%DURATIONM%*6000-%DURATIONS%*100)
if %DURATIONH% LSS 10 SET DURATIONH=0%DURATIONH%
if %DURATIONM% LSS 10 SET DURATIONM=0%DURATIONM%
if %DURATIONS% LSS 10 SET DURATIONS=0%DURATIONS%
if %DURATIONHS% LSS 10 SET DURATIONHS=0%DURATIONHS%
echo ------------------------------------------------------------------------------------------
echo task start time : %STARTTIME%
echo task end time : %ENDTIME%
echo task end in time : %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%
echo ------------------------------------------------------------------------------------------

endlocal

C:
PAUSE

我运行它并通过但日志时间是(fe):

task start time 14:35:36,24
task end time 14:39:43,55
task end in time : 00:00:00,14

并在此显示错误缺少运算符:

SET /A DURATION=%ENDTIME%-%STARTTIME%

你可以帮帮我吗?我正在搜索那个问题,但我找不到任何东西可以解决我的问题

感谢帮助

4

3 回答 3

1

您需要将时间字符串转换为秒 - 这并不容易。

幸运的是,由于您使用的是 24 小时制 - 这使得它更容易,但是编写数学增强功能的程序员出于某种奇怪的原因决定将带有前导零的字符串定义为八进制,因此 '08' 或 '09' 在子字符串将生成错误,因为 08/09 不是有效的八进制数...

所以 - 克服它的标准方法是在字符串前面加上一个“1”,然后减去 100。

下一个复杂之处是您将,其用作小数分隔符 - 这加剧了我们只能使用 INTEGER 数学的问题......

幸运的是,以前见过这样的事情。解决方案是UGLY+,但它有效。

@ECHO OFF
SETLOCAL
:: simply setting the start and end time to your posted values...
SET starttime=14:35:36,24
SET endtime=14:39:43,55
:: Here are some other value-pairs of interest (1) - elapsed = 8399,04
:: SET starttime=14:35:36,24
:: SET endtime=14:35:35,28
:: Here are some other value-pairs of interest (2) - elapsed = 0,04
:: SET starttime=14:35:36,24
:: SET endtime=14:35:36,28
:: Here are some other value-pairs of interest (3) - elapsed = 0,31
:: SET starttime=14:35:36,24
:: SET endtime=14:35:36,55
:: Here are some other value-pairs of interest (4) - elapsed = 7,31
:: SET starttime=14:35:36,24
:: SET endtime=14:35:43,55
CALL :CONVERT startsecs "%starttime%"
CALL :CONVERT endsecs "%endtime%"
ECHO SET /a elapsed=%endsecs% - %startsecs%
SET /a elapsed=endsecs - startsecs
IF %elapsed% lss 0 SET /a elapsed=%elapsed% + (24*360000)
IF %elapsed% lss 100 (IF %elapsed% lss 10 (SET elapsed=00%elapsed%) ELSE (SET elapsed=0%elapsed%))
ECHO elapsed TIME : %elapsed:~0,-2%,%elapsed:~-2%
::
GOTO :eof
en
:CONVERT
SET hundredths=%~2
SET /a %1=((((((1%hundredths:~0,2%) * 60) + 1%hundredths:~3,2%) * 60) + 1%hundredths:~6,2%) * 100) + 1%hundredths:~9,2% - 36610100
SET /a hundredths=((((((1%hundredths:~0,2% - 100) * 60) + 1%hundredths:~3,2% - 100) * 60) + 1%hundredths:~6,2% - 100) * 100) + 1%hundredths:~9,2% - 100
ECHO %2 %hundredths%
GOTO :eof

为了便于测试,我包含了一些值对,以及关于使用您的约定所经过的时间的评论。

下班的第一辆出租车是处理逗号。逗号是默认分隔符,因此简单的方法是引用传递给:convert例程的时间参数。第一个参数是放置计算结果的变量的名称。

在例程中,变量hundredths设置为第二个参数(带引号的时间字符串)并删除引号 ( %~2)

然后进行适当的计算。暂时跳过该SET /a %1=...行,所需的计算显示在下面的set hundredths=行中。将提供的时间的每个子字符串用前导字符串1,减去 100 并依次乘以 60、60、100 以计算自午夜以来的百分之一秒。然后简单地显示该计算的结果。

我包括了完整的计算,因为它是分配给的简化计算的祖先%1。神奇的数字 36610100 只是八进制保护咒添加到计算中的常数的总和。

计算的完整版本可以被注释掉,因为它在转换机制中没有任何作用。结果ECHO的 最好删除 - 只是在评估期间显示结果。

将开始时间和结束时间转换为自午夜以来的百分之一后,减去即可获得经过的时间。如果结果小于 100,则决定要添加多少前导零,并显示结果“就像来自 PIC 9'sV99”

于 2013-04-16T14:56:25.113 回答
0

您不能减去时间字符串,您需要先将%STARTTIME%and转换%ENDTIME%为秒,然后再计算%DURATION%. 只是给你一个提示:

set STARTTIME=%TIME%
set /A STARTTIME=%STARTTIME:~0,2%*3600+%STARTTIME:~3,2%*60+%STARTTIME:~6,2%
于 2013-04-16T13:36:29.430 回答
0

试试这个,它计算 24 小时(也是午夜 1 倍):

@echo off&setlocal
for /f "tokens=1-3delims=:," %%a in ("%time%") do (
    set /a "shr=(1%%a)-100"
    set /a "smin=(1%%b)-100"
    set /a "ssec=(1%%c)-100"
)
set /a startsec=%shr%*3600+%smin%*60+%ssec%
echo start at sec: %startsec%

ping -n 20 localhost >nul &rem .....do sth. smart.....

for /f "tokens=1-3delims=:," %%a in ("%time%") do (
    set /a "ehr=(1%%a)-100"
    set /a "emin=(1%%b)-100"
    set /a "esec=(1%%c)-100"
)
set /a endsec=%ehr%*3600+%emin%*60+%esec%
echo stop  at sec: %endsec%
if %startsec% leq %endsec% (set /a diffsec=%endsec%-%startsec%) else set /a diffsec=%endsec%+86400-%startsec%
echo running %diffsec% second(s^)
set /a ehr=(%diffsec%/3600)
set /a emin=(%diffsec%-(%ehr%*3600))/60
set /a esec=(%diffsec%-(%ehr%*3600)-(%emin%*60))
echo running for %ehr%h %emin%min %esec%sec
于 2013-04-16T15:05:45.860 回答