2013-04-16 64 views
0

我正在使用Windows 8並且想要寫入bat文件來記錄運行任務的時間。所以,我寫這篇文章:Windows命令提示計算錯誤

@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% 

能你幫我?我在尋找有關的問題,但我找不到什麼可mached巫婆我的問題

感謝您的幫助

+0

這是在你輸入'set /?' –

回答

1

你需要將你的timestrings轉換爲秒 - 並不那麼容易。幸運的是,由於您使用的是24小時制 - 這使得它更容易,但編寫數學增強功能的程序員決定了一些奇怪的原因,將一個前導零作爲OCTAL的字符串定義爲'08'或'09'在子字符串中將生成一個錯誤,因爲08/09不是有效的八進制數字...

SO - 標準方法是在字符串前面串入'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'V99」

+0

時在文檔中說明謝謝你的作品:)。也謝謝你的解釋,這對我很有幫助:) –

0

不能減時間字符串,則需要先轉換%STARTTIME%%ENDTIME%到秒,然後計算%DURATION%。只是給你一個提示:

set STARTTIME=%TIME% 
set /A STARTTIME=%STARTTIME:~0,2%*3600+%STARTTIME:~3,2%*60+%STARTTIME:~6,2% 
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 
+0

嗨,我嘗試你的代碼,但它不工作。我會有問題不平衡括號。 缺少操作數。 以秒開始: 不平衡括號。 缺少操作數。 停在秒: (集在這個時候是意想不到的。 –