2017-04-12 58 views
-4

我在下面使用這個腳本來跟蹤腳本每個部分的處理時間。當我在CMD提示符下運行它時,它完美地工作,但是當放入.bat時,它無法運行。這也是在兩個IF語句中構建的。 也對@driblio大喊,我從中得到這個。腳本在CMD中工作,但沒有批處理

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

::Process 

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. 
+3

由於您不在bat文件中顯示此代碼,我將猜測您將此代碼隱藏在FOR LOOP或IF構造中。如果是這樣,這將無法正常工作,因爲您的變量在LOAD時間擴展,而不是在RUN時間。您可以使用延遲擴展......但在這種情況下,將子程序從這些子程序中移出並從您的bat文件中調用它們會更容易。當然,你必須將開始時間的值傳遞給第二個子程序。發佈不完整的代碼幾乎總是會產生downvotes ...正如你可以看到已經發生的那樣。 – RGuggisberg

+0

所以你說要在構造內設置一個開始時間和結束時間 – EddieT

+0

否......除非你使用延遲擴展......我不建議......特別是如果你對它不熟悉的話...... 2子程序... 1開始和1結束使用您的代碼上面..發佈所有的代碼,如果你可以。 – RGuggisberg

回答

4

整個set /?

數值是十進制數字,除非0x爲 十六進制數,並0爲八進制數字前綴。因此0x12與 相同,因爲18022相同。請注意,八進制可以 是混亂0809無效的數字,因爲8 9不是有效的八進制數字。

所以echo "%startttime%"可能返回類似

" 9:08:09.04" 
    ↑↑   invalid in set /a 08 
     ↑↑  invalid in set /a 09 
      ↑↑  valid in set /a 04 

使用

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
set starttime=%TIME% 
rem debugging output echo "%starttime%" 
set /A startcsec=1%STARTTIME:~9,2% %% 100 
set /A startsecs=1%STARTTIME:~6,2% %% 100 
set /A startmins=1%STARTTIME:~3,2% %% 100 
set starthour=%STARTTIME:~0,2% 
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%) 
rem debugging output set start 

::Process 
:: pause to ensure that endtime >> starttime 
pause 

set endtime=%time% 
rem debugging output echo "%endtime%" 
set /A endcsec=1%endTIME:~9,2% %% 100 
set /A endsecs=1%endTIME:~6,2% %% 100 
set /A endmins=1%endTIME:~3,2% %% 100 
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%) 
rem debugging output set end 

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

echo. 
echo Took: %timetaken% sec. 

請注意,上面的代碼片斷仍取決於區域設置和用戶偏好。對於語言環境和用戶偏好獨立溶液,使用輸出從wmic os get localdatetime而非%time%如下:

for /F %%G in ('wmic OS get localdatetime /Value ^| find "="') do @set %%G 

然後,%localdatetime%將包含像在(固定長度)CIM_DATETIME format yyyymmddHHMMSS.mmmmmmsUUU20170413030820.447000+120其中在格式中的字段是

  • yyyy四位數年(0000至9999)。您的實施可以限制支持的範圍。例如,一個實現可以僅支持1980年到2099年。
  • mm兩位數月份(01到12)。
  • dd月的兩位數日(01到31)。該值必須適合該月份。例如,2月31日是無效的。 但是,您的實現不必檢查有效數據。
  • HH使用24小時制時鐘(00到23)的一天中的兩位數小時。
  • MM兩位數分鐘(00到59)。
  • SS分鐘(00到59)中的兩位數秒數。
  • mmmmmm秒中的六位數微秒數(000000到999999)。您的實施不必支持使用此字段的 評估。但是,此字段必須始終爲 以保留字符串的固定長度特性。
  • s加號(+)或減號( - )表示與協調世界時(UTC)的正負偏差。
  • UUU三位數偏移,表示始發時區偏離UTC的分鐘數。對於WMI,鼓勵 (但不是必需的)將時間轉換爲GMT(UTC偏移爲零)。
+0

考慮:'wmic'是slooow。所以如果你想精確到釐秒,'wmic'就不在了。 – Stephan