663 Stimmen

Wie messe ich die Ausführungszeit eines Befehls auf der Windows-Befehlszeile?

Gibt es eine integrierte Möglichkeit, die Ausführungszeit eines Befehls in der Windows-Befehlszeile zu messen?

1voto

Alexander Punkte 351

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.

0 Stimmen

Funktioniert nicht. Fehlender Operator bei einstelliger Stunde.

0 Stimmen

set _time=%time: =0% behebt das Problem mit der einstelligen Stunde - ersetze an beiden Stellen.

1voto

MikeM Punkte 11798
@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.

0 Stimmen

Funktioniert nicht. Erhalte: Unausgeglichene Klammer. Unaufgeglichene Klammer. Fehlender Operand.

0 Stimmen

@RichardSandoz Es funktioniert einwandfrei, es gibt keine ungeklärten Klammern. Wie benutzt du es?

1voto

Victor Mironov Punkte 41

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;

1voto

mvorisek Punkte 3048

Eine Lösung mit reinem PHP für cmd und eine Umgebungsvariable:

@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

0voto

bvj Punkte 3124

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.com

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.

Powered by:

X