Самый простой способ времени инструмент командной строки

9

Какой самый простой / быстрый способ рассчитать время инструмента командной строки?

Он не должен быть супер точным (+/- секунды в порядке), так как я ожидаю, что это займет минуты или даже 1 час +. И написание командного файла тоже хорошо. Кроме того, он не должен выполнять вычисления вовремя, просто отображать время начала и время окончания.

slolife
источник
Может принадлежать на Stackoverflow.
Джои
2
Если мне нужно что-то «запрограммировать», чтобы заставить это работать ... решение слишком сложное. Для этого должен быть какой-то инструмент командной строки или простое пакетное решение, не так ли?
Slolife
Скорее на Serverfault.
Кирилл Васильевич Лядвинский
Обычно ОС заботится только о том, сколько процессорного времени она использовала. Мой ответ ниже сделает то, что вы хотите. Я просто использую файл журнала для хранения информации.
Axxmasterr

Ответы:

19

Я обычно использую

echo.|time & my_command & echo.|time

когда у меня больше ничего нет под рукой. Это приводит к выводу, подобному следующему:

> echo. | time & ping -n 4 localhost> nul & echo. | time
Текущее время: 18: 42: 34,63
Введите новое время:
Текущее время: 18: 42: 37,68
Введите новое время:

Не симпатичен и может быть красивее с помощью команды findstr:

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

Если у вас включено отложенное расширение по умолчанию (или запущен cmd с /v:onаргументом в качестве аргумента), вы также можете просто использовать его, echo !time!не прибегая к уродливым хаки с перенаправлением ввода.

Если вы хотите использовать командный файл, вы можете сделать это следующим образом:

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

Я добавил перенаправление в nul для stdout и stderr, потому что в противном случае может быть трудно найти начальную и конечную строки. Вы можете удалить это, если это вас не касается.

Но в настоящее время я в основном использую TimeThis - который к настоящему времени был удален, к сожалению.

PowerShell также предлагает способ:

Measure-Command { my_command }

но вы должны быть осторожны с вещами, которые зависят от рабочего каталога или перенаправления. Для правильной работы вам может понадобиться небольшая хитрость:

@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

Это может быть выполнено так же, как timethis, обязательно избегайте двойных кавычек, \"если они необходимы в командной строке (так же, timethisкак и). Произведенная продукция похожа. Перенаправление не будет работать, хотя.

детеныш
источник
TimeThis из набора ресурсов Windows 2000 и больше не доступен; в 2003 году Resource Kit был TimeIt, который не работал на моей 64-битной Win7. Для PowerShell решения см superuser.com/questions/228056/...
Pesche
Это отстой. У меня все еще есть исполняемый файл, который лежал здесь с давних времен.
Джои
@pesche: я добавил командный файл, который может служить заменой timethis.
Джои
4

Вы можете использовать системный планировщик для запуска команды для вас.

Панель управления -> Запланированные задачи -> создать новый ....

Просто укажите запланированное задание на команду, которую вы хотите запустить, и она должна делать то, что вы хотите.

Если вы хотите создать файл журнала, в котором хранится информация о состоянии времени, вы можете подумать о том, чтобы сделать что-то похожее на скрипт выше.

Для этого я использую утилиту под названием «сейчас», которая будет отображать дату и время. Это очень удобно для сценариев командной строки, которые вы хотите отслеживать в файлах журналов, но у которых нет смысла для непосредственного включения даты / времени. Очень удобно, так как не заботится об ответе и исчезает, когда вы закончите с ним.

Теперь Utlity можно найти здесь

Пример сценария будет ...

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

Пример вывода будет выглядеть

--------------
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
источник
4

Другой вариант - использовать timeкоманду, с помощью /tкоторой будет выводиться текущее время на консоль (или перенаправляться в журнал) без запроса времени, которое нужно установить. есть ограничение в том, что оно даст вам часы, минуты, но не секунды и миллисекунды.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log
АКФ
источник
К сожалению, «время / t» не выводит секунды, просто «час: минута утра / вечера».
Slolife
да, я обновил ответ.
АКФ
1

Если у вас есть powershell, вы можете сделать это (все в одну строку, разбитые для удобства чтения):

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

Или сохраните это в файл для более легкого повторного использования.

# 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
источник
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 мс и 10,2 мс, используя Ctrl + v из буфера обмена

Steini
источник