Изящно останавливаясь в Powershell - PullRequest
25 голосов
/ 10 ноября 2009

Как мне перехватить и обработать Ctrl + C в скрипте PowerShell? Я понимаю, что могу сделать это с помощью командлета в v2, включив переопределение для метода Powershell.Stop(), но не могу найти аналог для использования в сценариях.

В настоящее время я выполняю очистку с помощью блока end , но мне нужно выполнить дополнительную работу, когда сценарий отменен (в отличие от запуска до завершения).

Ответы [ 3 ]

42 голосов
/ 03 апреля 2013

Документация для try-catch-finally гласит:

A Наконец, блок запускается, даже если вы используете CTRL + C, чтобы остановить скрипт. И наконец Блок также запускается, если ключевое слово Exit останавливает сценарий из Catch. блок.

См. Следующий пример. Запустите его и отмените, нажав ctrl-c.

try
{
    while($true)
    {
        "Working.."
        Start-Sleep -Seconds 1
    }
}
finally
{
    write-host "Ended work."
}
10 голосов
/ 24 ноября 2009

Вы можете использовать метод, описанный в здесь, в PoshCode

Резюме:

Установить

[console]::TreatControlCAsInput = $true

затем опросите для ввода пользователя, используя

if($Host.UI.RawUI.KeyAvailable -and (3 -eq  
    [int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
1 голос
/ 22 июля 2017

Существует также свойство Stopping для $PSCmdlet, которое можно использовать для этого.

...