Najłatwiejszy sposób na określenie czasu narzędzia wiersza poleceń

9

Jaki jest najłatwiejszy / najszybszy sposób pomiaru czasu narzędzia wiersza poleceń?

Nie musi to być bardzo dokładne (+/- sekundy jest w porządku), ponieważ spodziewam się, że zajmie to minuty, a nawet 1 godzinę +. Pisanie pliku wsadowego też jest w porządku. Ponadto nie musi wykonywać obliczeń na czas, wystarczy wyświetlić czas rozpoczęcia i czas zakończenia.

slolife
źródło
Może należeć do Stackoverflow.
Joey
2
Jeśli muszę coś „zaprogramować”, aby to zadziałało ... rozwiązanie jest zbyt skomplikowane. Musi być do tego jakieś narzędzie wiersza poleceń lub proste rozwiązanie wsadowe, nie?
slolife
Bardziej prawdopodobne w przypadku błędu serwera.
Kirill V. Lyadvinsky
Zasadniczo system operacyjny dba tylko o to, ile czasu procesora wykorzystał. Moja odpowiedź poniżej zrobi, co chcesz. Po prostu używam pliku dziennika do przechowywania informacji.
Axxmasterr

Odpowiedzi:

19

Zwykle używam

echo.|time & my_command & echo.|time

kiedy nie mam nic więcej pod ręką. Powoduje to, że dane wyjściowe są następujące:

> echo. | time & ping -n 4 localhost> nul i echo. | time
Aktualny czas to: 18: 42: 34,63
Wpisz nowy czas:
Aktualny czas to: 18: 42: 37,68
Wpisz nowy czas:

Nie jest ładna i może być ładniejsza, przesyłając potokiem do findstr:

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

Jeśli masz opóźnione rozszerzenie włączone domyślnie (lub uruchomiłeś cmd z /v:onargumentem), możesz także użyć echo !time!bez konieczności uciekania się do brzydkich hacków z przekierowaniem wejścia.

Jeśli chcesz użyć pliku wsadowego, możesz to zrobić w następujący sposób:

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

Dodałem przekierowanie do nul zarówno dla stdout, jak i stderr, ponieważ w przeciwnym razie znalezienie linii początkowej i końcowej może być trudne. Możesz to usunąć, jeśli nie dotyczy to ciebie.

Ale obecnie używam głównie TimeThis - który niestety został już usunięty.

PowerShell oferuje również sposób:

Measure-Command { my_command }

ale musisz uważać na rzeczy, które opierają się na katalogu roboczym lub przekierowaniu. Aby te działały poprawnie, możesz potrzebować trochę podstępu:

@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

Można to uruchomić w taki sam sposób, jak timethisto, aby uniknąć podwójnych cudzysłowów, \"jeśli są one potrzebne w wierszu poleceń (tak samo jak timethis). Wytworzona produkcja jest podobna. Przekierowania nie będą jednak działać.

Joey
źródło
TimeThis pochodzi z zestawu zasobów Windows 2000 i nie jest już dostępny; w 2003 Resource Kit to TimeIt, który nie działał na moim 64-bitowym Win7. Aby zapoznać się z rozwiązaniem PowerShell, zobacz superuser.com/questions/228056/…
pesche
To jest do bani. Jednak wciąż mam plik wykonywalny z dawnych czasów.
Joey
@pesche: Dodałem plik wsadowy, który może działać jako zamiennik drop-in timethis.
Joey,
4

Możesz użyć harmonogramu systemu, aby uruchomić polecenie za Ciebie.

Panel sterowania -> Zaplanowane zadania -> utwórz nowy ....

Po prostu skieruj zaplanowane zadanie na polecenie, które chcesz uruchomić, i powinno zrobić to, co chcesz.

Jeśli chcesz utworzyć plik dziennika przechowujący informacje o stanie czasu, możesz rozważyć zrobienie czegoś podobnego do powyższego skryptu.

Korzystam z narzędzia o nazwie „teraz”, ponieważ robi to echo daty i godziny. Jest to bardzo przydatne w przypadku skryptów wiersza poleceń, które chcesz śledzić w plikach dziennika, ale brakuje im inteligentnych opcji, aby natywnie podawać datę / godzinę. Bardzo przydatny, ponieważ nie zależy na odpowiedzi i znika, gdy skończysz.

Teraz Utlity można znaleźć tutaj

Przykładem skryptu byłoby ...

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

Przykładowy wynik wyglądałby

--------------
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
--------------
Axxmasterr
źródło
4

inną opcją jest użycie timepolecenia, za pomocą /tktórego bieżący czas zostanie wyświetlony w konsoli (lub przekieruje do dziennika) bez monitowania o ustawienie czasu. istnieje ograniczenie polegające na tym, że da ci godziny, minuty, ale nie sekundy i milisekundy.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log
akf
źródło
Niestety, „time / t” nie wyświetla sekund, a jedynie „hour: minute am / pm”.
slolife,
tak, zaktualizowałem odpowiedź.
akf
1

Jeśli masz PowerShell, możesz to zrobić (wszystkie linie podzielone dla czytelności):

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

Lub zapisz to w pliku, aby łatwiej użyć ponownie.

# 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())";
Roufamatic
źródło
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,5ms i 10,2ms za pomocą Ctrl + v ze schowka

Steini
źródło