2009-03-03 17 views

Odpowiedz

77

%time% powinny działać, pod warunkiem wystarczająco dużo czasu upłynie między połączeniami:

@echo OFF 

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

w moim systemie pojawia się następujący komunikat:

6: 46: 13.50
6: 46: 13,60

+2

Na moim komputerze pokazuje ten sam czas, nawet jeśli śpię między połączeniami. –

+0

Czy możesz opublikować kod pliku wsadowego, który próbujesz profilować? –

+0

nm, jestem idiotą. :) –

2

Może może pomóc this tool? Nie zwraca czasu, ale jest dobrym narzędziem do mierzenia czasu, w jakim polecenie się znajduje.

+0

Dzięki, +1 pomocne. Ale nadal interesujące, dlaczego nie ma prostego wydruku w partii ... –

+4

Podoba mi się ta sugestia. Niestety bez nazwy narzędzia, gdy link się zrywa (np. Teraz), nie widzę, o czym mówisz. – Stephen

+4

Myślę, że mogło to być "timethis.exe" (które w chwili pisania tego tekstu wydaje się być dostępne za pośrednictwem [tego łącza] (http://download.microsoft.com/download/win2000platform/timethis/1.00. 0.1/NT5/EN-US/timethis_setup.exe) – Henning

31

Jeśli robisz coś takiego, jak

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

lub

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

następnie można po prostu umieścić setlocal enabledelayedexpansion na początku pliku wsadowym i użyć !time! zamiast %time% który zostanie oceniony na wykonanie, a nie na parsowania linii (która zawiera kompletne bloki ujęte w nawiasy).

23

Poniższa partia "program" powinna zrobić, co chcesz. Zwróć uwagę, że wysyła dane w centisekundach zamiast w milisekundach. Dokładność użytych poleceń to tylko centisekundy.

Oto przykładowe wyjście:

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

Oto skrypt wsadowy:

@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% ma format H: MM: SS CS po północy, a tym samym konwersja na centisekundy nie działa. Widząc post Patrick Cuffa o 6:46, wydaje mi się, że to nie tylko ja. –

+0

(1% STARTTIME: ~ 6,2% -100) * 100 powinno być (1% STARTTIME: ~ 6,2% -100) * 1000 itd. – Kvant

+0

(1% STARTTIME: ~ 9,2% -100) powinno być (1% STARTTIME: ~ 9,2% -100) * 10 itd. – Kvant

2

% TIME% jest w formacie H: MM: SS, CS po północy, a więc konwersja na centisekundy> nie działa. Widząc post Patrick Cuffa o 6:46, wydaje mi się, że to nie tylko ja.

Ale z tej linii Bevor trzeba będzie rozwiązać ten problem proste:

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

Dziękujemy za miłą inspiracji! Lubię go używać w moich mplayer, ffmpeg, sox Scripts, aby pimpować moje pliki multimedialne dla starych PocketPlayerów dla zabawy.

2

Musisz być ostrożny z tym, co chcesz robić, ponieważ nie chodzi tylko o zdobycie czasu.

Ta partia zawiera wewnętrzne zmienne do przedstawienia daty i czasu: % DATA%% TIME%. Ale one zależą od ustawień regionalnych Windows.

% Data%:

  • DD.MM.YYYY
  • DD.MM.RR
  • dMyy
  • dd/MM/rr
  • rrrr MM-dd

% CZAS% :

  • H: mm: ss, msek
  • HH: mm: ss, msek

Teraz, jak długo skrypt będzie działał i kiedy? Na przykład, jeśli będzie dłuższy niż jeden dzień i minie północ, to na pewno pójdzie źle, ponieważ różnica między 2 znacznikami czasu między północą jest wartością ujemną! Potrzebujesz daty, aby ustalić prawidłową odległość między dniami, ale jak to zrobić, jeśli format daty nie jest stały? Rzeczy z % DATE% i % TIME% może pójść jeszcze gorzej i gorzej, jeśli będziesz ich używać do celów matematycznych.

Powodem jest % DATE% i % TIME% są istnieć tylko pokazać datę i czas użytkownika na wyjściu, aby nie używać ich w obliczeniach. Jeśli chcesz uzyskać prawidłową odległość między wartościami czasu lub wygenerować unikalną wartość w zależności od daty i czasu, musisz użyć czegoś innego i dokładniejszego niż % DATA% i % TIME%.

Używam wmic okien wbudowanych narzędzie do żądania takich rzeczy (umieścić go w pliku skryptu):

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

lub wpisz go w konsoli cmd.exe:

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

The wadą tego jest powolne działanie w przypadku częstych połączeń. Na maszynie kopalniowej jest to około 12 połączeń na sekundę.

Jeśli chcesz kontynuować korzystanie to wtedy można napisać coś takiego (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 

Teraz można analizować % Return_Value% somethere w skrypcie:

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%