Zwei Dinge springen über die ursprüngliche Batch-Datei.
, aber beides wird auf lange Sicht nicht helfen.
Was auch immer Ihre Benchmark-Methode, müssen Sie die Startzeit vor den Betrieb und die Endzeit nach der Betrieb zu erfassen. Ihre Probe tut das nicht.
%time%
ergibt etwas wie "12: 34: 56.78", und der SET /A
Befehl kann diese nicht subtrahieren. Sie benötigen einen Befehl, der einen einfachen skalaren Zeitstempel erzeugt.
Ich wollte es nicht getan werden sagen können, aber die Batch-Sprache ist viel mächtiger als es so hier Kredit für, gegeben ist, ist eine einfache Implementierung von TIMER.BAT. Für die Aufzeichnung schlug Pax mich auf eine Antwort die Zeichenfolge Spaltung zeigt, während ich um hantiere, und Johannes Rössel schlug die Arithmetik außerhalb des gemessenen Bereichs bewegt:
@echo off
setlocal
rem Remeber start time. Note that we don't look at the date, so this
rem calculation won't work right if the program run spans local midnight.
set t0=%time: =0%
rem do something here.... but probably with more care about quoting.
rem specifically, odd things will happen if any arguments contain
rem precent signs or carets and there may be no way to prevent it.
%*
rem Capture the end time before doing anything else
set t=%time: =0%
rem make t0 into a scaler in 100ths of a second, being careful not
rem to let SET/A misinterpret 08 and 09 as octal
set /a h=1%t0:~0,2%-100
set /a m=1%t0:~3,2%-100
set /a s=1%t0:~6,2%-100
set /a c=1%t0:~9,2%-100
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem make t into a scaler in 100ths of a second
set /a h=1%t:~0,2%-100
set /a m=1%t:~3,2%-100
set /a s=1%t:~6,2%-100
set /a c=1%t:~9,2%-100
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem runtime in 100ths is now just end - start
set /a runtime = %endtime% - %starttime%
set runtime = %s%.%c%
echo Started at %t0%
echo Ran for %runtime%0 ms
Sie können die Arithmetik vereinfachen und eine wenig mehr sein ehrlich über die Gesamtgenauigkeit davon, nicht mit den 100. eines zweiten Teils zu belästigen.Hier ist es in Aktion, vorausgesetzt, Sie haben einen Schlafbefehl oder eine andere Zeit Waster:
C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>
Edit: ich den Code und seine Beschreibung überarbeitet wie in einem Kommentar vorgeschlagen.
Ich denke, dass, wenn das NT-Team COMMAND.COM mit CMD.EXE ersetzte, sie dachten, sie würden nicht damit durchkommen, es sehr anders zu machen. Aber in Wirklichkeit ist es fast eine völlig neue Sprache. Viele der alten Favoritenbefehle haben neue Funktionen, wenn die Erweiterungen aktiviert sind.
Eine davon ist SETLOCAL
, die verhindert, dass Variablen die Umgebung des Anrufers ändern. Ein anderer ist SET /A
, der Ihnen eine bemerkenswerte Menge an Arithmetik bietet. Der Haupttrick, den ich hier verwendet habe, ist die neue Zeichenkettenextraktionssyntax, wobei %t:~3,2%
die zwei Zeichen bedeutet, die bei Offset 3 im Wert der Variablen t
beginnen.
Für einen echten Schocker, werfen Sie einen Blick auf die vollständige Beschreibung der Satz (versuchen SET /?
an einer Eingabeaufforderung), und wenn das nicht abschreckt, Blick auf FOR /?
und feststellen, dass es sich um Text aus Dateien analysieren kann ...
Edit 2: Festfehlbedienung von Zeitfeldern enthalten 08
oder 09
von Frankie in den Kommentaren berichtet. Tweaked ein paar Dinge und fügte einige Kommentare hinzu.
Beachten Sie, dass hier eine grelle Aufsicht herrscht, die ich wahrscheinlich nicht beheben werde. Es wird nicht funktionieren, wenn der Befehl an einem anderen Tag als am Ende beginnt. Das heißt, es wird etwas Mathe bezogen auf die Tageszeit und einen Unterschied berichten, aber der Unterschied wird nicht viel bedeuten.
Fixing es zumindest warnen über diesen Fall ist einfach. Es zu reparieren, um das Richtige zu tun, ist schwieriger.
Bearbeiten 3: Fehler behoben, bei dem% h% nicht für einstellige Stunden eingestellt ist. Dies liegt daran, dass% time% "9: 01: 23.45" zurückgibt. Beachten Sie das Leerzeichen. Mit% time: = 0% wird das Leerzeichen durch eine führende Null ersetzt und% h% wird korrekt gesetzt. Dieser Fehler trat nur auf, wenn ein Skript von einer einstelligen Stunde zur nächsten lief.
shouldn‘ test du die Endzeit, nachdem du etwas getan hast? ist es ein Tippfehler? –
Nun, Sie könnten einfach "Zeit ./myscript" – mpen
@mark, in einem Lager Windows-Installation, Zeit ist ein Befehl in CMD.EXE eingebaut, der die aktuelle Uhrzeit setzt oder anzeigt. – RBerteig