Вообще для измерения скорости выполнения той, или иной команды в Powershell есть командлет Measure-Command. Но в определённых случаях он может не подойти. Например, если нужно не только подсчитать время выполнения команды, но и вывести результат команды на экран – при использовании Measure-Command на экран выводится только его результат.
Конечно, можно занести результат выполнения команды в переменную и вывести её, но сегодня поговорим именно о том как засечь время.
Первое, что приходит на ум – это “вручную” засечь время до начала выполнения команды, и после окончания, после чего высчитать разницу из этих значений:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Замеряем время до начала выполнения команды $Start = Get-Date Get-ChildItem 'C:\Program Files\' -Filter "*.txt" -Recurse # Замеряем время после выполнения команды $End = Get-Date # Высчитываем время выполнения команды $Time = $End - $Start "Время выполнения команды: $($Time.Seconds) секунд(ы)" |
Но есть более изящный способ.
Это использование объекта System.Diagnostics.Stopwatch:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Создаём объект таймер $Timer = [System.Diagnostics.Stopwatch]::StartNew() # Запускаем таймер $Timer.Start() Get-ChildItem 'C:\Program Files\' -Filter "*.txt" -Recurse # Останавливаем таймер $Timer.Stop() "Время выполнения команды $($Timer.Elapsed.Seconds) секунд" |
В полученном результате нам интересно свойство Elapsed.
При таком способе получается чуть более длинная форма вывода, за счёт того, что само свойство Elapsed это ещё не объект временного диапазона (TimeSpan), как в первом случае:
1 2 |
PS C:\> $Time.GetType().Name TimeSpan |
а объект Stopwatch (System.Diagnostics.Stopwatch):
1 2 |
PS C:\> $Timer.GetType().Name Stopwatch |
Одно из свойств которого (Elapsed) как раз и содержит интересующее нас время:
1 2 |
PS C:\> $Timer.Elapsed.GetType().Name TimeSpan |
Зато не нужно вычислять время вручную.