2009-11-10 94 views
21

如何在PowerShell腳本中捕捉和處理Ctrl + C?我知道我可以通過在第2版中的cmdlet中包含Powershell.Stop()方法的覆蓋來實現此操作,但我無法找到用於腳本的模擬。在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#中的cmdlet,因此我可以覆蓋Stop()。 – 2009-11-25 06:43:14

30

documentation的嘗試,catch-用戶輸入最後說:

即使您使用CTRL + C停止腳本,也會運行finally塊。 A如果Exit關鍵字停止Catch 塊內的腳本,則最後還會運行 塊。

請看下面的例子。運行它並按ctrl-c取消它。

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

這是真的,但最後會運行,不僅因爲調用了Exit,而且如果Try塊成功。正如我在我的問題中指出的那樣,當腳本被取消(而不是運行完成)時,我需要執行額外的工作。 – 2013-04-04 00:18:32

+5

@ fatcat111使用布爾標誌。例如,在'try'結尾處設置'$ didcomplete = $ true',並用'if($ didcomplete){Write-Host「結束工作。 }''finally'裏面' – 2014-03-15 18:48:55

+0

不幸的是,如果PowerShell控制檯窗口關閉,finally塊不會被執行。 – 2017-12-29 10:11:48

1

還有上$PSCmdlet一個Stopping屬性,可以用於此目的。

+0

即使每個[PowerShell/PowerShell#6322](https://github.com/PowerShell/PowerShell/issues/6322)停止,「Stopping」也是「false」。 – alx9r 2018-03-06 17:46:51