2013-03-23 57 views
0

我發現這個代碼可愛的小珍聞這裏:https://stackoverflow.com/a/5262637/2128987Windows命令行上計算給錯誤

@echo off 

set starttime=%TIME% 
set startcsec=%STARTTIME:~9,2% 
set startsecs=%STARTTIME:~6,2% 
set startmins=%STARTTIME:~3,2% 
set starthour=%STARTTIME:~0,2% 
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%) 

:TimeThis 
robocopy /e /NFL /NDL /NJH /NJS /nc /ns /np folder%rndfolder% %drvltr%:\f%dirnew%\ 

set endtime=%time% 
set endcsec=%endTIME:~9,2% 
set endsecs=%endTIME:~6,2% 
set endmins=%endTIME:~3,2% 
set endhour=%endTIME:~0,2% 
if %endhour% LSS %starthour% set /a endhour+=24 
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%) 

set /a timetaken= (%endtime% - %starttime%) 
set /a timetakens= %timetaken%/100 
set timetaken=%timetakens%.%timetaken:~-2% 

echo. 
echo Took: %timetaken% sec. 

由於它的偉大工程,一個獨立的程序。我通常使用robocopy命令來確定寫入文件需要多長時間。

我在其中添加一個額外的變量,因爲我想保留原始秒爲計算目的。所以我添加了額外的行集timeraw =%timetaken%:

set /a timetaken= (%endtime% - %starttime%) 
***set timeraw=%timetaken%*** 
set /a timetakens= %timetaken%/100 
set timetaken=%timetakens%.%timetaken:~-2% 

我的批處理文件還使用SETLOCAL enabledelayedexpansion

好有時不正確地計算「開始時間」或「結束時間」。它保持它在08原時間:30:22.35類型格式和導致錯誤:

Invalid number. Numeric constants are either decimal (17),hexadecima (0x11), or octal (021) 

很明顯嘛,因爲它包含非數字字符,如:角色。

我的批處理文件永遠連續循環,因爲我正在使用它來讀取,寫入,刪除特定酷刑測試條件下的文件和文件夾。

任何想法爲什麼它會間歇性地不計算starttime或endtime變量?

編輯:

我做了一些改變,以我的整體的腳本。我不再需要enabledelayedexpansion,清理了一些if語句,並簡化了一些代碼。但是,我仍然偶爾會將起始時間或結束時間變量保留爲HH:MM:SS.CS的原始時間格式,並導致計算出錯。

+0

任何人都知道爲什麼它會這樣做? – HTWingNut 2013-03-26 21:54:38

回答

0

老問題,但可能有括號的塊,當您在括號內更改變量時,則需要使用延遲擴展。

運行此操作並檢查差異。

@echo off 
set a=nothing 
    if z==z (
     set a=b 
     echo %a% 
    ) 
pause 
setlocal enabledelayedexpansion 
set a=nothing 
    if z==z (
     set a=b 
     echo !a! 
    ) 
pause 
0

嘖嘖 - 一個將近一歲的問題,沒有答案。

我假設問題現在已經解決了,所以作爲一個記錄,我認爲 「有時它不能正確計算」是因爲小時/分鐘/秒/百分之一將包含「08」或「09」不是八進制數字。

的解決方案是

set /a startcsec=1%STARTTIME:~9,2% - 100 

,並與每一個其他3 start時間段的重複;然後再次用end部件重複。

此外,它可能是小時正在呈現與0抑制。在這種情況下,我建議

set starttime=0%TIME: =% 
set starttime=%startTIME:~-11% 
set /a startcsec=1%STARTTIME:~9,2% - 100 

,其中第一行用前綴「0」的時候,並取代空間與[無]
第二選擇剛剛過去的11個字符結果
最後是熟悉的形式,使用結果hh:mm:ss.cc格式。

(顯然,子串和計算方法的其餘部分也需要執行)