Der einfachste Weg, ein Befehlszeilentool zu messen


9

Was ist der einfachste / schnellste Weg, um ein Befehlszeilentool zu messen?

Es muss nicht sehr genau sein (+/- Sekunden sind in Ordnung), da ich davon ausgehe, dass dies Minuten oder sogar 1 Stunde + dauert. Und das Schreiben einer Batch-Datei ist auch in Ordnung. Außerdem müssen keine pünktlichen Berechnungen durchgeführt werden. Zeigen Sie lediglich die Start- und Endzeit an.


Könnte auf Stackoverflow gehören.
Joey

2
Wenn ich etwas "programmieren" muss, damit dies funktioniert ... ist die Lösung zu kompliziert. Dafür muss es ein Kommandozeilen-Tool oder eine einfache Batch-Lösung geben, oder?
Slolife

Wahrscheinlicher bei Serverfault.
Kirill V. Lyadvinsky

Im Allgemeinen kümmert sich das Betriebssystem nur darum, wie viel CPU-Zeit es verbraucht hat. Meine Antwort unten wird tun, was Sie wollen. Ich verwende nur eine Protokolldatei, um die Informationen zu speichern.
Axxmasterr

Antworten:


19

Ich benutze normalerweise

echo.|time & my_command & echo.|time

wenn ich sonst nichts zur hand habe. Dies führt zu einer Ausgabe wie der folgenden:

> echo. | time & ping -n 4 localhost> nul & echo. | time
Die aktuelle Zeit ist: 18: 42: 34,63
Geben Sie die neue Zeit ein:
Die aktuelle Zeit ist: 18: 42: 37,68
Geben Sie die neue Zeit ein:

Nicht hübsch und kann durch Piping zu findstr schöner gemacht werden:

echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current

Wenn Sie die standardmäßig aktivierte Erweiterung verzögert haben (oder cmd mit /v:onals Argument gestartet haben ), können Sie sie auch einfach verwenden, echo !time!ohne auf hässliche Hacks mit Eingabeverleitung zurückgreifen zu müssen.

Wenn Sie eine Batchdatei verwenden möchten, können Sie dies folgendermaßen tun:

@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%

Ich habe hier nul für stdout und stderr umgeleitet, da es sonst schwierig sein könnte, die Start- und Endzeilen zu finden. Sie können dies entfernen, wenn Sie dies nicht interessieren.

Aber heutzutage benutze ich meistens TimeThis - das leider inzwischen entfernt wurde.

PowerShell bietet auch einen Weg:

Measure-Command { my_command }

Sie müssen jedoch vorsichtig mit Dingen sein, die vom Arbeitsverzeichnis oder der Umleitung abhängen. Damit diese richtig funktionieren, benötigen Sie möglicherweise einen kleinen Trick:

@echo off
setlocal enableextensions

rem Prepare current directory and command line so they
rem can be stuck into a single-quoted PowerShell string.
set "Dir=%CD:'=''%"
set "Cmd=%*"
set "Cmd=%Cmd:'=''%"

rem Prepare command to pass to PowerShell
set Command=
set "Command=&{"
set "Command=%Command%  Set-Location '%Dir%'"
set "Command=%Command%; [Environment]::CurrentDirectory = '%Dir%'"
set "Command=%Command%; $start = Get-Date"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host"
set "Command=%Command%; iex 'cmd /c %Cmd%'"
set "Command=%Command%; $end = Get-Date"
set "Command=%Command%; Write-Host"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host ('    End time     : ' + $end.ToString())"
set "Command=%Command%; Write-Host ('    Elapsed time : ' + ($end - $start).ToString())"
set "Command=%Command%; }"

powershell -noprofile -command "%Command%"

endlocal

Dies kann auf die gleiche Weise ausgeführt werden wie timethis, um doppelte Anführungszeichen zu vermeiden, \"wenn sie in der Befehlszeile benötigt werden ( timethiswie auch). Die erzeugte Ausgabe ist ähnlich. Umleitungen funktionieren jedoch nicht.


TimeThis stammt aus dem Windows 2000 Resource Kit und ist nicht mehr verfügbar. 2003 war Resource Kit TimeIt, das auf meinem 64-Bit-Win7 nicht funktionierte. Für ein Powershell - Lösung siehe superuser.com/questions/228056/...
pesche

Das ist Scheiße. Ich habe aber immer noch die ausführbare Datei, die hier aus alten Zeiten herumliegt.
Joey

@pesche: Ich habe eine Batch-Datei hinzugefügt, die als Drop-In-Ersatz für dienen kann timethis.
Joey

4

Sie können den Systemplaner verwenden, um den Befehl für Sie auszuführen.

Systemsteuerung -> Geplante Aufgaben -> Neue erstellen ....

Richten Sie die geplante Aufgabe einfach auf den Befehl, den Sie ausführen möchten, und sie sollte das tun, was Sie möchten.

Wenn Sie eine Protokolldatei erstellen möchten, in der Zeitstatusinformationen gespeichert sind, sollten Sie etwas Ähnliches wie das obige Skript in Betracht ziehen.

Ich benutze dazu ein Dienstprogramm namens "now", da es Datum und Uhrzeit wiedergibt. Dies ist sehr praktisch für Befehlszeilenskripte, die Sie in Protokolldateien verfolgen möchten, denen jedoch die Smarts fehlen, um Datum und Uhrzeit nativ anzugeben. Sehr praktisch, da es sich nicht um eine Antwort kümmert und sie verschwindet, wenn Sie damit fertig sind.

Jetzt finden Sie Utlity hier

Skriptbeispiel wäre ...

echo -------------- >>logfile.txt
now Process Starting>> logfile.txt
<commandhere> <target> >> logfile.txt
now process Ending >> logfile.txt
echo -------------- >> logfile.txt

Die Beispielausgabe würde so aussehen

--------------
Mon Mar 06 14:58:48 2009 Process Starting
GNU Super Duper Process PID 12345! Success
Mon Mar 06 21:47:01 2009 Process Ending
--------------

4

Eine andere Möglichkeit besteht darin, den timeBefehl zu verwenden, mit /tdem die aktuelle Zeitüberschreitung an die Konsole gesendet wird (oder in ein Protokoll umgeleitet wird), ohne dass Sie aufgefordert werden, die Zeit einzustellen. Es gibt eine Einschränkung darin, dass Sie die Stunden, Minuten, aber nicht Sekunden und Millisekunden erhalten.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log

Leider gibt "time / t" keine Sekunden aus, sondern nur "Stunde: Minute am / pm".
Slolife

Richtig, ich habe die Antwort aktualisiert.
Akf

1

Wenn Sie Powershell haben, können Sie dies tun (alle eine Zeile, zur besseren Lesbarkeit getrennt):

PS C:\> $startTime=Get-Date;ping /n 4 localhost;$endTime=Get-Date;
        echo "Finished in $(($endTime-$startTime).ToString())"

Oder speichern Sie diese zur einfacheren Wiederverwendung in einer Datei.

# usage: .\timer.ps1 program [arguments]

$startTime = Get-Date;
$prog = $args[0];
$progargs = $args[1..($args.length-1)];

&$prog $progargs

$endTime = Get-Date;

echo "Finished in $(($endTime - $startTime).ToString())";

1
In command prompt:
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime

Output:
C:\Users\Steini> wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.370000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.525000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.627000+000

15,5 ms und 10,2 ms mit Strg + v aus der Zwischenablage


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.