Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Секундомір для PowerShell скрипта.

Іноді потрібно визначити час, витрачений на виконання команди або скрипта. У PowerShell є кілька способів вирішення цього завдання. Наприклад в .NET є спеціальний клас StopWatch, який можна використовувати як секундомір для виміру часу, витраченого на виконання завдання.

Клас StopWatch входить в простір імен System.Diagnostics і у нього є статичний метод StartNew. За допомогою цього методу створимо новий екземпляр класу StopWatch, збережемо його в змінну і виведемо властивості і методи нашого "таймера":

$ watch = [System.Diagnostics.Stopwatch] :: StartNew ()
$ watch | Get-Member

Тут нас цікавлять методи Start і Stop, що відповідають за запуск і зупинку таймера і властивість Elapsed, що показує час, що минув.



Тепер створимо ось такий скрипт, який шукає в папці Windows всі файли з розширенням txt і записує отриманий результат в файл:

$ watch = [System.Diagnostics.Stopwatch] :: StartNew ()
$ watch.Start () # Запуск таймера
Get-Childitem -Path C : \ Windows -Filter "* .txt" -Recurse | Out-File C: \ Files \ files.txt
$ watch.Stop () # Зупинка таймера
Write-Host $ watch.Elapsed # Час виконання

Запустимо його і подивимося, що видасть секундомір. Як бачите, виконання завдання зайняло трохи більше 3 секунд (3,2).



Ще для вимірювання часу виконання завдання в PowerShell є командлет Measure-Command. Цей командлет бере команду \ блок команд, зазначену в фігурних дужках, виконує її всередині себе і в якості результату видає час, витрачений на виконання.Ось так буде виглядати наш скрипт з використанням Measure-Command:

Measure-Command -Expression {Get-Childitem -Path C: \ Windows -Filter "* .txt" -Recurse | Out-File C: \ Files \ files.txt}

Результат такий самий, як і в попередньому прикладі - 3,2 секунди.



Measure-Command видає результат в не дуже зручному вигляді. Для того, щоб отримати більш наочне уявлення, можна скористатися методом ToString:

$ time = Measure-Command -Expression {Get-Childitem -Path C: \ Windows`
-Filter "*.txt "-Recurse | Out-File C: \ Files \ files.txt}
$ time.ToString ()

В цьому випадку результат виводиться в один рядок, в такому ж вигляді, як і при використанні StopWatch.



на закінчення нагадаю, що на швидкість виконання скрипта може впливати завантаженість системи, швидкість мережею та інші зовнішні чинники.Для однієї і тієї ж команди, запущеної в різний час результат може помітно відрізнятися. Тому для отримання більш-менш точного результату вимірювання варто повторити 2-3 рази.

.