2009-03-03 40 views

Antwort

77

%time% sollte funktionieren, vorausgesetzt, genügend Zeit zwischen den Anrufen abgelaufen ist:

@echo OFF 

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

Auf meinem System bekomme ich folgende Ausgabe:

6: 46: 13.50
6: 46: 13.60

+2

Auf meinem Computer zeigt es die gleiche Zeit, auch wenn ich zwischen den Gesprächen schlafen. –

+0

Können Sie den Code für die Batch-Datei veröffentlichen, die Sie profilieren möchten? –

+0

nm, ich bin ein Idiot. :) –

2

Vielleicht this tool könnte helfen? Es gibt die Zeit nicht zurück, aber es ist ein gutes Werkzeug, um die Zeit zu messen, die ein Befehl benötigt.

+0

Danke, +1 hilfreich. Aber immer noch interessant, warum es keinen einfachen Zeitdruck im Batch gibt ... –

+4

Ich mag diesen Vorschlag. Leider ohne den Namen des Werkzeugs, wenn die Verbindung bricht (z. B. jetzt), kann ich nicht sehen, worüber Sie sprechen. – Stephen

+4

Ich _think_ könnte es 'timethis.exe' gewesen sein (was zum Zeitpunkt des Schreibens scheint verfügbar sein über [diesen Link] (http://download.microsoft.com/download/win2000platform/timethis/1.00. 0.1/NT5/DE-US/timethis_setup.exe). – Henning

31

Wenn Sie etwas wie

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

oder

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

dann könnte man einfach eine setlocal enabledelayedexpansion am Anfang Ihrer Batch-Datei setzen und !time! statt %time% verwenden, die auf die Ausführung ausgewertet wird, nicht die Linie auf das Parsen (die komplette Blöcke enthält in Klammern angegeben).

23

Unter Batch "Programm" sollte tun, was Sie wollen. Bitte beachten Sie, dass die Daten in Millisekunden statt in Millisekunden ausgegeben werden. Die Genauigkeit der verwendeten Befehle beträgt nur Centisekunden. Hier

ist ein Beispiel für die Ausgabe:

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

Hier ist die Batch-Skript:

@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% ist im Format H: MM: SS , CS nach Mitternacht und daher Umwandlung in Centiseconds funktioniert nicht. Wenn ich Patrick Cuffs Post mit 6:46 Uhr sehe, scheint es, dass es nicht nur ich ist. –

+0

die (1% STARTZEIT: ~ 6,2% -100) * 100 sollte sein (1% STARTZEIT: ~ 6,2% -100) * 1000 usw. – Kvant

+0

die (1% STARTZEIT: ~ 9,2% -100) sollte sein (1% STARTZEIT: ~ 9,2% -100) * 10 usw. – Kvant

2

% TIME% im Format H: MM: SS, CS nach Mitternacht und damit Umwandlung in Centiseconds> funktioniert nicht. Wenn ich Patrick Cuffs Post mit 6:46 Uhr sehe, scheint es, dass es nicht nur ich ist.

Aber mit diesen Zeilen Bevor sollten Sie dieses Problem beheben einfach:

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

Vielen Dank für Ihre schöne Inspiration! Ich benutze es gerne in meinen mplayer, ffmpeg, sox Scripts, um meine Mediadateien für alte PocketPlayer nur zum Spaß zu pimpen.

2

Sie müssen vorsichtig sein mit dem, was Sie tun möchten, weil es nicht nur darum geht, die Zeit zu bekommen.

Die Charge hat interne Variablen zur Darstellung des Datums und des Tme: % DATE%% TIME%. Sie sind jedoch abhängig von der Windows-Ländereinstellung.

% Datum%:

  • dd.MM.yyyy
  • tt.MM.uu
  • dMyy
  • TT/MM/JJ
  • yyyy-MM-dd

% TIME% :

  • H: mm: ss, ms
  • HH: mm: ss,
  • ms

Nun, wie lange Ihr Skript funktioniert und wann? Zum Beispiel, wenn es länger als ein Tag ist und die Mitternacht passiert, wird es definitiv falsch gehen, weil die Differenz zwischen 2 Zeitstempeln zwischen Mitternacht ein negativer Wert ist! Sie benötigen das Datum, um den richtigen Abstand zwischen den Tagen herauszufinden, aber wie Sie das tun, wenn das Datumsformat keine Konstante ist? Dinge mit % DATE% und % TIME% könnte schlechter und schlechter werden, wenn Sie sie weiterhin für die mathematischen Zwecke verwenden.

Der Grund ist das % DATE% und % TIME% sind gibt es nur ein Datum, zu zeigen, und eine Zeit Benutzer in der Ausgabe, sie nicht für Berechnungen verwendet werden. Wenn Sie also den richtigen Abstand zwischen einigen Zeitwerten herstellen oder einen von Datum und Uhrzeit abhängigen eindeutigen Wert generieren möchten, müssen Sie etwas anderes und genaueres als % DATE% und % TIME% verwenden.

Ich verwende die wmic Windows-Dienstprogramm gebautet solche Dinge zu beantragen (es in einer Skriptdatei) setzen:

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

oder es in der cmd.exe Konsole eingeben:

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

Die Nachteil davon ist eine langsame Leistung bei häufigen Anrufen. Auf meiner Maschine sind es ungefähr 12 Anrufe pro Sekunde.

Wenn Sie den Vorgang fortsetzen möchten dies dann können Sie so etwas wie dieses (get_datetime.bat) schreiben:

@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 

Jetzt können Sie % RETURN_VALUE% somethere in Ihrem Skript analysieren:

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% 
Verwandte Themen