Gibt es eine integrierte Möglichkeit, die Ausführungszeit eines Befehls in der Windows-Befehlszeile zu messen?
Funktioniert nicht. Fehlender Operator bei einstelliger Stunde.
Gibt es eine integrierte Möglichkeit, die Ausführungszeit eines Befehls in der Windows-Befehlszeile zu messen?
Die Antwort von driblio kann etwas kürzer gemacht werden (obwohl nicht viel lesbarer)
@echo off
:: Berechnen des Startzeitstempels
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _started=_hours*60*60*100+_min*60*100+_sec*100+_cs
:: yourCommandHere
:: Berechnen des Unterschieds in 100stel Sekunden
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _duration=_hours*60*60*100+_min*60*100+_sec*100+_cs-_started
:: Variablen für die Darstellung füllen (100+ benötigt für die Polsterung)
set /a _hours=_duration/60/60/100,_min=100+_duration/60/100%%60,_sec=100+(_duration/100%%60%%60),_cs=100+_duration%%100
echo Fertig um: %_time% dauerte: %_hours%:%_min:~-2%:%_sec:~-2%.%_cs:~-2%
:: gibt etwas wie aus:
:: Fertig um: 12:37:53,70 dauerte: 0:02:03.55
Zu der Bemerkung von Luke Sampson ist diese Version oktal sicher, obwohl die Aufgabe innerhalb von 24 Stunden abgeschlossen sein sollte.
@echo off & setlocal
set start=%time%
REM Hier kommt der Code hin, den man timen möchte.
REM Alternativ kann die folgende Zeile einkommentiert werden, um
REM das auszuführende Kommando zu übergeben, wenn dieses Skript ausgeführt wird.
REM cmd /c %*
set end=%time%
REM Berechnung der benötigten Zeit in Sekunden, auf hundertstel genau.
REM Es wird davon ausgegangen, dass Start- und Endzeit am selben Tag liegen.
set options="tokens=1-4 delims:."
for /f %options% %%a in ("%start%") do (
set /a start_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
set /a start_hs=100%%d %% 100
)
for /f %options% %%a in ("%end%") do (
set /a end_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
set /a end_hs=100%%d %% 100
)
set /a s=%end_s%-%start_s%
set /a hs=%end_hs%-%start_hs%
if %hs% lss 0 (
set /a s=%s%-1
set /a hs=100%hs%
)
if 1%hs% lss 100 set hs=0%hs%
echo.
echo Benötigte Zeit: %s%.%hs% Sekunden
echo.
Wenn Perl installiert ist, die beste verfügbare hires Lösung ausführen:
C:\BATCH>time.pl "echo Feines Ergebnis"
0.01063
Feines Ergebnis
STDERR kommt vor den gemessenen Sekunden
#!/usr/bin/perl -w
use Time::HiRes qw();
my $T0 = [ Time::HiRes::gettimeofday ];
my $stdout = `@ARGV`;
my $time_elapsed = Time::HiRes::tv_interval( $T0 );
print $time_elapsed, "\n";
print $stdout;
@echo off
setlocal enableextensions
REM setze Startzeit Umgebungsvariable
FOR /F "tokens=* USEBACKQ" %%F IN (`php -r "echo microtime(true);"`) DO ( SET start_time=%%F )
## HIER_DEN_AUSZUFÜHRENDEN_BEFEL_EINFÜGEN ##
REM Zeitdauer ausgeben
php -r "echo 'verstrichen: ' . (round(microtime(true) - trim(getenv('start_time')), 2)) . ' Sekunden' . mb_convert_encoding('
', 'UTF-8', 'HTML-ENTITIES');"
Kein Bedarf für Cygwin oder nicht vertrauenswürdige Hilfsprogramme. Nützlich, wenn PHP lokal verfügbar ist
Genauigkeit und Ausgabeformat können einfach angepasst werden
Die gleiche Idee kann auch für PowerShell übernommen werden
Das folgende Skript emuliert *nix-Epoche-Zeit, ist jedoch lokal und regional. Es sollte Randfälle des Kalenders behandeln, einschließlich Schaltjahren. Wenn Cygwin verfügbar ist, können Epoch-Werte durch Angabe der Cygwin-Option verglichen werden.
Ich befinde mich in EST, und der gemeldete Unterschied beträgt 4 Stunden, was relativ korrekt ist. Es gibt einige interessante Lösungen, um die Zeitzonen- und regionalen Abhängigkeiten zu entfernen, aber nichts Triviales, das mir aufgefallen ist.
@ECHO off
SETLOCAL EnableDelayedExpansion
::
:: Emuliert lokale Epoch-Sekunden
::
:: Aufruf unter Angabe des lokalen Datums und der lokalen Zeit
CALL :SECONDS "%DATE%" "%TIME%"
IF !SECONDS! LEQ 0 GOTO END
:: Nicht zum Testen - Ausgabe und Beendigung
IF NOT "%~1"=="cygwin" (
ECHO !SECONDS!
GOTO END
)
:: Aufruf auf Cygwin, um die Epochezeit zu erhalten
FOR /F %%c IN ('C:\cygwin\bin\date +%%s') DO SET EPOCH=%%c
:: Ergebnisse anzeigen
ECHO Lokale Sekunden: !SECONDS!
ECHO Epoch-Sekunden: !EPOCH!
:: Differenz zwischen Skript und Cygwin berechnen
SET /A HOURS=(!EPOCH!-!SECONDS!)/3600
SET /A FRAC=(!EPOCH!-!SECONDS!)%%3600
:: Delta-Stunden zeigen die Zeitzonen an
ECHO Delta-Stunden: !HOURS! Rest: !FRAC!
GOTO END
:SECONDS
SETLOCAL EnableDelayedExpansion
:: Erwarte Werte vom Aufrufer
SET DATE=%~1
SET TIME=%~2
:: Emuliere Unix-Epochezeit ohne Berücksichtigung der Zeitzonen
SET "SINCE_YEAR=1970"
:: Regionale Einschränkung! Erwarte Datum und Uhrzeit im folgenden Format:
:: Sun 03/08/2015 Tag MM/TT/JJJJ
:: 20:04:53.64 SS:MM:SS
SET VALID_DATE=0
ECHO !DATE! | FINDSTR /R /C:"^... [0-9 ][0-9]/[0-9 ][0-9]/[0-9][0-9][0-9][0-9]" > nul && SET VALID_DATE=1
SET VALID_TIME=0
ECHO !TIME! | FINDSTR /R /C:"^[0-9 ][0-9]:[0-9 ][0-9]:[0-9 ][0-9]" > nul && SET VALID_TIME=1
IF NOT "!VALID_DATE!!VALID_TIME!"=="11" (
IF !VALID_DATE! EQU 0 ECHO Nicht unterstützter Datumswert: !DATE! 1>&2
IF !VALID_TIME! EQU 0 ECHO Nicht unterstützter Zeitwert: !TIME! 1>&2
SET SECONDS=0
GOTO SECONDS_END
)
:: Werte analysieren
SET "YYYY=!DATE:~10,4!"
SET "MM=!DATE:~4,2!"
SET "DD=!DATE:~7,2!"
SET "HH=!TIME:~0,2!"
SET "NN=!TIME:~3,2!"
SET "SS=!TIME:~6,2!"
SET /A YEARS=!YYYY!-!SINCE_YEAR!
SET /A DAYS=!YEARS!*365
:: Jahr erhöhen, wenn nach Februar - führende Nullen für diesen Test erforderlich
IF "!MM!!DD!" GEQ "0301" SET /A YEARS+=1
:: Entferne führende Nullen, die bei SET /A Probleme verursachen können
FOR %%r IN (MM,DD,HH,NN,SS) DO (
SET "v=%%r"
SET "t=!%%r!"
SET /A N=!t:~0,1!0
IF 0 EQU !N! SET "!v!=!t:~1!"
)
:: Erhöhe die Tage entsprechend der Anzahl der Schaltjahre
SET /A DAYS+=(!YEARS!+3)/4-(!SINCE_YEAR!%%4+3)/4
:: Erhöhe die Tage um die vorhergehenden Monate des aktuellen Jahres
FOR %%n IN (31:1,28:2,31:3,30:4,31:5,30:6,31:7,31:8,30:9,31:10,30:11) DO (
SET "n=%%n"
IF !MM! GTR !n:~3! SET /A DAYS+=!n:~0,2!
)
:: Multiplizieren und alles zusammenaddieren
SET /A SECONDS=(!DAYS!+!DD!-1)*86400+!HH!*3600+!NN!*60+!SS!
:SECONDS_END
ENDLOCAL & SET "SECONDS=%SECONDS%"
GOTO :EOF
:END
ENDLOCAL
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.