Изящно останавливаясь в Powershell
Как я могу захватить и обрабатывать Ctrl + C в PowerShell script? Я понимаю, что я могу сделать это из командлета в v2, включив переопределение для метода Powershell.Stop()
, но я не могу найти аналог для использования в скриптах.
В настоящее время я выполняю очистку через блок end
, но мне нужно выполнить дополнительную работу, когда script отменяется (в отличие от завершения работы).
Ответы
Ответ 1
Вы можете использовать метод, описанный в здесь, на PoshCode
Резюме:
Set
[console]::TreatControlCAsInput = $true
затем выполните опрос для ввода пользователем с помощью
if($Host.UI.RawUI.KeyAvailable -and (3 -eq
[int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
Ответ 2
Документация для try-catch - наконец-то говорит:
A Блок finally работает, даже если вы используете CTRL + C, чтобы остановить script. A Наконец-то block также запускается, если ключевое слово Exit останавливает script изнутри Catch блок.
См. следующий пример. Запустите его и отмените, нажав ctrl-c
.
try
{
while($true)
{
"Working.."
Start-Sleep -Seconds 1
}
}
finally
{
write-host "Ended work."
}
Ответ 3
В $PSCmdlet
есть свойство Stopping
, которое можно использовать для этого.