9

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

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

6 ответов6

19

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

echo.|time & my_command & echo.|time

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

> echo.|time & ping -n 4 localhost > nul & echo.|time
The current time is: 18:42:34,63
Enter the new time:
The current time is: 18:42:37,68
Enter the new time:

Не симпатичен и может быть красивее с помощью команды 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 ). Произведенная продукция похожа. Перенаправление не будет работать, хотя.

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
--------------
4

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

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log
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 из буфера обмена

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())";
0

Пользователи Far Manager 1.x могут рассмотреть плагин Timer .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .