Der einfachste Weg, um ein Befehlszeilentool zeitlich festzulegen

12529
slolife

Was ist der einfachste / schnellste Weg, um ein Befehlszeilentool zeitlich festzulegen?

Es muss nicht extrem genau sein (+/- Sekunden ist in Ordnung), da ich davon ausgehe, dass dies Minuten oder sogar 1 Stunde + dauern wird. Und das Schreiben einer Batch-Datei ist auch in Ordnung. Außerdem müssen Berechnungen nicht rechtzeitig durchgeführt werden. Es werden lediglich die Start- und Endzeit angezeigt.

9
Könnte zu Stackoverflow gehören. Joey vor 14 Jahren 0
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. slolife vor 14 Jahren 2
Wahrscheinlicher bei Serverfault. Kirill V. Lyadvinsky vor 14 Jahren 0
Im Allgemeinen kümmert sich das Betriebssystem nur um die verwendete CPU-Zeit. Meine Antwort unten wird tun, was Sie wollen. Ich verwende nur eine Protokolldatei, um die Informationen zu speichern. Axxmasterr vor 14 Jahren 0

6 Antworten auf die Frage

19
Joey

Ich benutze normalerweise

echo.|time & my_command & echo.|time 

wenn ich nichts anderes zur hand habe. Dies bewirkt eine Ausgabe wie die folgende:

> echo. | zeit & ping -n 4 localhost> nul & echo. | zeit 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 schön und kann durch Piping an findstr schöner gemacht werden:

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

Wenn Sie die verzögerte Erweiterung standardmäßig aktiviert haben (oder cmd mit /v:onals Argument gestartet haben ), können Sie sie auch verwenden, echo !time!ohne hässliche Hacks mit der Umleitung von Eingaben verwenden 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 eine Umleitung zu nul für stdout und stderr hinzugefügt, da es sonst schwierig sein könnte, die Start- und Endlinie zu finden. Sie können es entfernen, wenn dies für Sie kein Anliegen ist.

Heutzutage verwende ich meistens TimeThis, das leider leider entfernt wurde.

PowerShell bietet auch einen Weg:

Measure-Command { my_command } 

Sie müssen jedoch auf Dinge achten, die auf das Arbeitsverzeichnis oder die Umleitung angewiesen sind. Damit diese korrekt funktionieren, benötigen Sie möglicherweise ein paar Tricks:

@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 dieselbe Art und Weise ausgeführt werden, indem Sie timethisdoppelte Anführungszeichen mit einschließen, \"wenn sie in der Befehlszeile benötigt werden timethis. Die Ausgabe ist ähnlich. Umleitungen funktionieren jedoch nicht.

TimeThis stammt aus dem Windows 2000 Resource Kit und ist nicht mehr verfügbar; 2003 Resource Kit ist TimeIt, was auf meinem 64bit Win7 nicht funktionierte. Eine PowerShell-Lösung finden Sie unter http://superuser.com/questions/228056/windows-equivalent-to-unix-time-command pesche vor 10 Jahren 0
Das ist Scheiße. Ich habe aber immer noch die ausführbare Datei aus alten Zeiten hier herumliegen. Joey vor 10 Jahren 0
@pesche: Ich habe eine Batchdatei hinzugefügt, die als Ersatz für `timethis` dienen kann. Joey vor 10 Jahren 0
4
Axxmasterr

Sie können den System-Scheduler verwenden, um den Befehl für Sie auszuführen.

Systemsteuerung -> Geplante Aufgaben -> Neues erstellen ...

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

Wenn Sie eine Protokolldatei erstellen möchten, in der Informationen zum Zeitstatus gespeichert werden, empfiehlt es sich möglicherweise, etwas Ähnliches wie das obige Skript auszuführen.

Ich benutze dazu ein Dienstprogramm namens "now", da Datum und Uhrzeit wiedergegeben werden. Dies ist sehr praktisch für Befehlszeilenskripts, die Sie in Protokolldateien nachverfolgen möchten, jedoch nicht über die intelligenten Möglichkeiten verfügen, Datum und Uhrzeit nativ anzugeben. Sehr praktisch, da es nicht auf eine Antwort ankommt und sie verschwindet, wenn Sie damit fertig sind.

Jetzt kann Utlity hier gefunden werden

Skriptbeispiel wäre ...

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

Beispielausgabe würde 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
akf

Eine andere Option besteht darin, den timeBefehl zu verwenden, mit /tdem die aktuelle Uhrzeit an die Konsole ausgegeben wird (oder in ein Protokoll umgeleitet wird), ohne dass die Uhrzeit angegeben wird. Es gibt eine Einschränkung dahingehend, dass Sie Stunden, Minuten, aber keine 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 vor 14 Jahren 0
Recht hast du, ich habe die Antwort aktualisiert. akf vor 14 Jahren 0
1
roufamatic

Wenn Sie über Powershell verfügen, können Sie dies tun (alle aus einer 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 Datei in einer Datei, um sie wiederzuverwenden.

# 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
Steini
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

0
Vadzim

Far Manager 1.x-Benutzer können das Timer- Plugin in Betracht ziehen .