dimayakovlev.ru


Как написать простой таймер в PowerShell

Когда возникает потребность отследить интервал времени, можно воспользовать программой-таймером. В 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 помогут отследить время выполнения любых бытовых задач с использованием персонального компьютера без использования дополнительного программного обеспечения. Отдельно можно подумать о том, как эффективнее привлечь внимание пользователя после завершения работы таймера. В этом могут помочь другие заметки по использованиею PowerShell, например, после завершение работы таймера можно изменить обои рабочего стола или уведомить пользователя голосом.