2009-11-10 20 views
21

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

私は現在、クリーンアップvia an end blockを実行していますが、スクリプトがキャンセルされたとき(完了までに実行されるのではなく)、別の作業を実行する必要があります。

答えて

5

あなたが上で説明した方法を使用することができhere on PoshCode

概要:

設定

[console]::TreatControlCAsInput = $true 

その後、

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

うわー、それは狂っています。私はC#でコマンドレットとしてスクリプトを書き直したので、Stop()をオーバーライドすることができました。 –

30

のtry-catch-ためdocumentationを使用してユーザの入力をポーリング最終的には:

Aスクリプトを停止するのにCTRL + Cキーを使用した場合でも、最後にブロックが実行されます。 A最後に ブロックは、ExitキーワードがCatch ブロック内からスクリプトを停止する場合にも実行されます。

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

try 
{ 
    while($true) 
    { 
     "Working.." 
     Start-Sleep -Seconds 1 
    } 
} 
finally 
{ 
    write-host "Ended work." 
} 
+0

これは本当ですが、Exitが呼び出されただけでなく、Tryブロックが成功した場合にも実行されます。私の質問に示されているように、スクリプトがキャンセルされたときに(完了まで実行するのではなく)追加の作業を実行する必要があります。 –

+5

@ fatcat111はブールフラグを使用します。たとえば、 'try'の最後に' $ didcomplete = $ true'をセットし、 'if($ didcomplete){Write-Host"が終了したことを確認してください。 } 'finally 'の内部 –

+0

残念ながら、PowerShellコンソールウィンドウが閉じているとfinallyブロックは実行されません。 –

1

このために使用することができる$PSCmdletStoppingプロパティもあります。

+0

[PowerShell/PowerShell#6322](https://github.com/PowerShell/PowerShell/issues/6322)ごとに停止する場合でも、 '停止中 'は' false'です。 – alx9r

関連する問題