web-dev-qa-db-ja.com

Powershellで優雅に停止します

キャッチして処理するにはどうすればよいですか Ctrl+C PowerShellスクリプトで? Powershell.Stop()メソッドのオーバーライドを含めることで、v2のコマンドレットからこれを実行できることは理解していますが、スクリプトで使用するアナログが見つかりません。

現在クリーンアップを実行しています endブロックを介して ですが、スクリプトがキャンセルされたときに(最後まで実行するのではなく)追加の作業を実行する必要があります。

26
Justin R.

ここではPoshCode で説明されている方法を使用できます。

概要:

セットする

[console]::TreatControlCAsInput = $true

次に、を使用してユーザー入力をポーリングします

if($Host.UI.RawUI.KeyAvailable -and (3 -eq  
    [int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
10
FkYkko

documentation for try-catch-finallyのコメント:

CTRL + Cを使用してスクリプトを停止しても、Finallyブロックが実行されます。 ExitキーワードがCatchブロック内からスクリプトを停止した場合も、Finallyブロックが実行されます。

次の例を参照してください。実行し、ctrl-cを押してキャンセルします。

try
{
    while($true)
    {
        "Working.."
        Start-Sleep -Seconds 1
    }
}
finally
{
    write-Host "Ended work."
}
43
staale.skaland

$PSCmdletにはこれに使用できるStoppingプロパティもあります。

1