2013-02-04 181 views
1

我正在使用批處理腳本進行時間測量命令。我在StackOverflow上找到了這個腳本。不幸的是,它有時不能正常工作,不幸的是我對批量編程知之甚少。我覺得它有時候有用,有時候不會。也許我在這方面犯錯,但看起來它在午夜後不能正常工作。時間測量的批處理腳本無法正常工作

腳本:

@echo off 
setlocal 

rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99 
set STARTTIME=%TIME% 

rem here begins the command you want to measure 
dir /s > nul 
rem here ends the command you want to measure 

set ENDTIME=%TIME% 

echo STARTTIME %STARTTIME% 

rem convert STARTTIME and ENDTIME to centiseconds 

set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) 

echo STARTTIME %STARTTIME% 

echo ENDTIME %ENDTIME% 

set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) 

echo ENDTIME %ENDTIME% 

rem calculating the duration is easy 
set /A DURATION=%ENDTIME%-%STARTTIME% 

rem we might have measured the time inbetween days 
if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% 

rem outputing 

echo DURATION: %DURATION% in centiseconds 

endlocal 
goto :EOF 

我用它半小時前,我得到了這樣的結果:

STARTTIME 1:29:25.17 
STARTTIME 1:29:25.17 
ENDTIME 1:29:27.82 
ENDTIME 1:29:27.82 
DURATION: 1 in centiseconds 

因此,一些與線

set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) 

該行

set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) 

似乎是錯的。

這是什麼?

問候, 大衛

回答

3

問題是"%STARTTIME:~0,2%-100"" 1",還有一個額外的空間。該程序然後嘗試查找(1 1)而不是(101)的值。

在前面的額外1只應爲系統,其輸出的時間作爲"01:29:25.17"(得到101,而不是01,系統將解釋爲八進制數),但對於系統,其輸出的時間作爲" 1:29:25.17"(注的空間在1)的前面有一個問題(這將給1 1)。

一個簡單的方法是刪除STARTTIME=(1%STARTTIME:~0,2%-100)*360000ENDTIME=(1%ENDTIME:~0,2%-100)*360000中的1,但這可能會導致其他系統出現問題。

更水密的解決辦法是REM行之後添加兩行:

rem convert STARTTIME and ENDTIME to centiseconds 

set STARTTIME=%STARTTIME: =0% 

set ENDTIME=%ENDTIME: =0% 

(編輯:安德烈·M的短得多的上述方法)


還有兩個setif %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%這可能會在嘗試測量兩天之間的時間時導致問題。

+1

+1,儘管無需檢查是否存在空格,您可以無條件替換爲'0':'SET'STARTTIME =%STARTTIME:= 0%「',對於'ENDTIME'也是如此。這樣,如果您在計算之前立即將其置於計算之前,則可以保持代碼的其餘部分不變。 –

+0

好主意,我編輯它。我在考慮領導0將指定八進制符號,這很可能是前面1的目的。 – user2033427