Когда возникает потребность отследить интервал времени, можно воспользовать программой-таймером. В Microsoft Windows для этих целей я часто использую Microsoft Clock, но когда запущена консоль PowerShell, то делаю это прямо в ней.
Самый простой вариант таймера для любителей однострочных сценариев на PowerShell выглядит так.
Start-Sleep -Seconds 120; Write-Output 'Timer done!'
В этом коде при помощи командлета Start-Sleep
происходит остановка выполнения сценария на заданное количество секунд. Когда не удобно измерять интервал времени задержки в секундах, можно вызвать командлет Start-Sleep
с параметром -Duration
, которому передаётся объект типа TimeSpan
, определяющий интервал времени в удобных пользователю единицах.
Start-Sleep -Duration (New-TimeSpan -Minutes 2); Write-Output 'Timer done!'
После того, как командлет Start-Sleep
позволит продолжить выполнение сценария, в консоли будет выведено сообщение, информирующее пользователя о том, что таймер завершил работу.
Таймер корректно отсчитал заданный интервал времени, однако не информировал пользователя о ходе отсчёта. В случае, когда важно отслеживать оставшееся до завершения работы таймера время, можно выводить сообщения в консоль. Делается это при помощи цикла.
$s = 60
Write-Output 'Timer start!'
do {
Write-Output "$s second remaining"
$s--
Start-Sleep -Seconds 1
} until ($s -eq 0)
Write-Output 'Timer done!'
Здесь в переменной $s
задаётся длинна интервала времени в секундах. Затем, при помощи цикла do...until
, каждую секунду в консоль выводится сообщение о количестве секунд, оставшихся до завершения работы таймера.
Если не удобно рассчитывать длинну интервала времени в секундах, можно задать его с использованием объекта типа TimeSpan
, а затем при помощи метода TotalSeconds
получить его длинну в секундах.
$timespan = New-TimeSpan -Hour 1 -Minutes 4 -Seconds 14
$s = $timespan.TotalSeconds
Такой вариант таймера информативнее и даёт пользователю возможность оценить время, оставшееся до его завершения. Однако в ходе работы таймера в консоль будет выведено число сообщений, равное длинне измеряемого промежутка времени в секундах. Альтернативой этому может быть использование командлета Write-Progress
, предназначенного специально для отображения хода выполнения процесса в удобном для восприятия виде - в виде индикатора выполнения (progress bar).
$s = 60
do {
Write-Progress -Activity 'Wait to finish' -Status 'Seconds remaining: ' -SecondsRemaining $s -Id 1
$s--
Start-Sleep -Seconds 1
} until ($s -eq 0)
Write-Output 'Timer done!'
Для того, чтобы сделать индикатор выполнения таймера ещё информативнее, можно добавить вычисление процента оставшегося времени. Для этого следует ввести новую переменную, которая будет хранить начальное значение переменной $s
и не будет изменяться в цикле.
$s = 60
$total = $s
do {
$percent = $s / $total * 100
Write-Progress -Activity 'Wait to finish' -Status 'Seconds remaining: ' -SecondsRemaining $s -PercentComplete $percent -Id 1
$s--
Start-Sleep -Seconds 1
} until ($s -eq 0)
Write-Output 'Timer done!'
Эти простые варианты сценариев таймеров на PowerShell помогут отследить время выполнения любых бытовых задач с использованием персонального компьютера без использования дополнительного программного обеспечения. Отдельно можно подумать о том, как эффективнее привлечь внимание пользователя после завершения работы таймера. В этом могут помочь другие заметки по использованиею PowerShell, например, после завершение работы таймера можно изменить обои рабочего стола или уведомить пользователя голосом.