Wie drucke ich die Zeit (in ms) in einer Windows-Stapeldatei?Druckzeit in einer Batchdatei (Millisekunden)
Ich möchte die Zeit messen, die zwischen Zeilen in meiner Batch-Datei vergeht, aber Windows "time/T" druckt keine Millisekunden.
Wie drucke ich die Zeit (in ms) in einer Windows-Stapeldatei?Druckzeit in einer Batchdatei (Millisekunden)
Ich möchte die Zeit messen, die zwischen Zeilen in meiner Batch-Datei vergeht, aber Windows "time/T" druckt keine Millisekunden.
%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
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.
Danke, +1 hilfreich. Aber immer noch interessant, warum es keinen einfachen Zeitdruck im Batch gibt ... –
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
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
Wenn Sie etwas wie
tunfor /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).
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
% 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. –
die (1% STARTZEIT: ~ 6,2% -100) * 100 sollte sein (1% STARTZEIT: ~ 6,2% -100) * 1000 usw. – Kvant
die (1% STARTZEIT: ~ 9,2% -100) sollte sein (1% STARTZEIT: ~ 9,2% -100) * 10 usw. – Kvant
% 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.
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%:
% TIME% :
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%
Auf meinem Computer zeigt es die gleiche Zeit, auch wenn ich zwischen den Gesprächen schlafen. –
Können Sie den Code für die Batch-Datei veröffentlichen, die Sie profilieren möchten? –
nm, ich bin ein Idiot. :) –