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