2009-03-03 25 views

Trả lời

77

%time% nên làm việc, cung cấp đủ thời gian đã trôi qua giữa các cuộc gọi:

@echo OFF 

@echo %time% 
ping -n 1 -w 1 127.0.0.1 1>nul 
@echo %time% 

Trên hệ thống của tôi, tôi nhận được đầu ra sau đây:

6: 46: 13,50
6: 46: 13,60

+2

Trên máy của tôi, nó hiển thị cùng một lúc ngay cả khi tôi ngủ giữa các cuộc gọi. –

+0

Bạn có thể đăng mã cho tập tin thực thi mà bạn đang cố gắng để hồ sơ? –

+0

nm, tôi là một thằng ngốc. :) –

2

Có thể this tool có thể trợ giúp? Nó không trả lại thời gian, nhưng nó là một công cụ tốt để đo thời gian một lệnh.

+0

Xin cảm ơn, +1 hữu ích. Nhưng vẫn thú vị tại sao không có thời gian in đơn giản theo lô ... –

+4

Tôi thích đề xuất này. Rất tiếc, không có tên của công cụ, khi liên kết bị hỏng (ví dụ: ngay bây giờ), tôi không thể nhìn thấy những gì bạn đang nói đến. – Stephen

+4

Tôi _think_ nó có thể là 'timethis.exe' (trong đó, tại thời điểm viết, dường như có sẵn qua [liên kết này] (http://download.microsoft.com/download/win2000platform/timethis/1.00. 0.1/NT5/EN-US/timethis_setup.exe) – Henning

31

Nếu bạn đang làm điều gì đó như

for /l %%i in (1,1,500) do @echo %time% 

hoặc

if foo (
    echo %time% 
    do_something 
    echo %time% 
) 

sau đó bạn chỉ có thể đặt một setlocal enabledelayedexpansion vào đầu tập tin thực thi của bạn và sử dụng !time! thay vì %time% mà được đánh giá tình hình thực hiện, không phải trên phân tích các dòng (bao gồm khối hoàn chỉnh kèm theo trong dấu ngoặc đơn).

23

Dưới hàng loạt "chương trình" nên thực hiện những gì bạn muốn. Xin lưu ý rằng nó xuất dữ liệu theo mili giây thay vì mili giây. Độ chính xác của các lệnh được sử dụng chỉ là một phần nghìn giây.

Dưới đây là một ví dụ đầu ra:

STARTTIME: 13:42:52,25 
ENDTIME: 13:42:56,51 
STARTTIME: 4937225 centiseconds 
ENDTIME: 4937651 centiseconds 
DURATION: 426 in centiseconds 
00:00:04,26 

Đây là kịch bản hàng loạt:

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

rem output as time 
echo STARTTIME: %STARTTIME% 
echo ENDTIME: %ENDTIME% 

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

rem calculating the duratyion 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 now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds 
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) 

rem some formatting 
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% 

rem outputing 
echo STARTTIME: %STARTTIME% centiseconds 
echo ENDTIME: %ENDTIME% centiseconds 
echo DURATION: %DURATION% in centiseconds 
echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS% 

endlocal 
goto :EOF 
+0

% TIME% có định dạng H: MM: SS , CS sau nửa đêm và do đó chuyển đổi thành mili giây không hoạt động. Thấy bài viết của Patrick Cuff với 6:46 sáng có vẻ như không chỉ có tôi. –

+0

(1% STARTTIME: ~ 6,2% -100) * 100 phải là (1% STARTTIME: ~ 6,2% -100) * 1000 vv – Kvant

+0

(1% STARTTIME: ~ 9,2% -100) phải là (1% STARTTIME: ~ 9,2% -100) * 10 v.v. – Kvant

2

% TIME% có định dạng H: MM: SS, CS sau nửa đêm và do đó chuyển đổi thành mili giây> không hoạt động. Thấy bài viết của Patrick Cuff với 6:46 sáng có vẻ như không chỉ có tôi.

Nhưng với dòng này bevor bạn nên sẽ khắc phục vấn đề đó dễ dàng:

if " "=="%StartZeit:~0,1%" set StartZeit=0%StartZeit:~-10% 
if " "=="%EndZeit:~0,1%" set EndZeit=0%EndZeit:~-10% 

Nhờ cảm hứng tốt đẹp của bạn! Tôi thích sử dụng nó trong mplayer của tôi, ffmpeg, sox Scripts để pimp mediafiles của tôi cho PocketPlayers cũ chỉ để cho vui.

2

Bạn phải cẩn thận với những gì bạn muốn làm, bởi vì nó không chỉ là về để có được thời gian.

Lô có các biến nội bộ để biểu thị ngày và giờ: % DATE%% TIME%. Nhưng chúng phụ thuộc vào Windows Locale.

% ngày%:

  • dd.MM.yyyy
  • DD.MM.YY
  • dMyy
  • dd/MM/yy
  • yyyy-MM-dd

% TIME% :

  • H: mm: ss, msec
  • HH: mm: ss, msec

Bây giờ, bao lâu kịch bản của bạn sẽ làm việc và khi nào? Ví dụ, nếu nó sẽ dài hơn một ngày và không vượt qua nửa đêm nó chắc chắn sẽ sai, bởi vì sự khác biệt giữa 2 dấu thời gian giữa nửa đêm là một giá trị âm! Bạn cần ngày để tìm ra khoảng cách chính xác giữa các ngày, nhưng làm thế nào bạn làm điều đó nếu định dạng ngày không phải là một hằng số? Những thứ có % DATE%% TIME% có thể trở nên tồi tệ hơn và tồi tệ hơn nếu bạn tiếp tục sử dụng chúng cho mục đích toán học.

Lý do là % NGÀY%% TIME% là chỉ tồn tại là để hiển thị ngày tháng và thời gian để sử dụng trong sản xuất, chứ không phải để sử dụng chúng để tính toán. Vì vậy, nếu bạn muốn tạo khoảng cách chính xác giữa một số giá trị thời gian hoặc tạo một số giá trị duy nhất tùy thuộc vào ngày và giờ thì bạn phải sử dụng một cái gì đó khác và chính xác hơn % DATE%% TIME%.

Tôi đang sử dụng các cửa sổ wmic BUILTIN tiện ích để yêu cầu điều đó (đặt nó trong một tập tin script):

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE`) do if "%%i" == "LocalDateTime" echo.%%j 

hoặc gõ từ đúng vào cmd.exe console:

for /F "usebackq tokens=1,2 delims==" %i in (`wmic os get LocalDateTime /VALUE`) do @if "%i" == "LocalDateTime" echo.%j 

Các bất lợi của điều này là một hiệu suất chậm trong trường hợp các cuộc gọi thường xuyên. Trên máy của tôi nó là khoảng 12 cuộc gọi mỗi giây.

Nếu bạn muốn tiếp tục sử dụng này thì bạn có thể viết một cái gì đó như thế này (get_datetime.bat):

@echo off 

rem Description: 
rem Independent to Windows locale date/time request. 

rem Drop last error level 
cd . 

rem drop return value 
set "RETURN_VALUE=" 

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if "%%i" == "LocalDateTime" set "RETURN_VALUE=%%j" 

if not "%RETURN_VALUE%" == "" (
    set "RETURN_VALUE=%RETURN_VALUE:~0,18%" 
    exit /b 0 
) 

exit /b 1 

Bây giờ, bạn có thể phân tích % RETURN_VALUE% somethere trong kịch bản của bạn:

call get_datetime.bat 
set "FILE_SUFFIX=%RETURN_VALUE:.=_%" 
set "FILE_SUFFIX=%FILE_SUFFIX:~8,2%_%FILE_SUFFIX:~10,2%_%FILE_SUFFIX:~12,6%" 
echo.%FILE_SUFFIX% 
Các vấn đề liên quan