如何在PowerShell腳本中捕捉和處理Ctrl + C?我知道我可以通過在第2版中的cmdlet中包含Powershell.Stop()
方法的覆蓋來實現此操作,但我無法找到用於腳本的模擬。在PowerShell腳本中優雅地停止
我目前正在執行清理via an end
block,但是當腳本被取消(而不是運行到完成)時,我需要執行額外的工作。
如何在PowerShell腳本中捕捉和處理Ctrl + C?我知道我可以通過在第2版中的cmdlet中包含Powershell.Stop()
方法的覆蓋來實現此操作,但我無法找到用於腳本的模擬。在PowerShell腳本中優雅地停止
我目前正在執行清理via an end
block,但是當腳本被取消(而不是運行到完成)時,我需要執行額外的工作。
你可以使用描述的方法here on PoshCode
摘要:
集
[console]::TreatControlCAsInput = $true
然後輪詢使用
if($Host.UI.RawUI.KeyAvailable -and (3 -eq
[int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
的documentation的嘗試,catch-用戶輸入最後說:
即使您使用CTRL + C停止腳本,也會運行finally塊。 A如果Exit關鍵字停止Catch 塊內的腳本,則最後還會運行 塊。
請看下面的例子。運行它並按ctrl-c
取消它。
try
{
while($true)
{
"Working.."
Start-Sleep -Seconds 1
}
}
finally
{
write-host "Ended work."
}
這是真的,但最後會運行,不僅因爲調用了Exit,而且如果Try塊成功。正如我在我的問題中指出的那樣,當腳本被取消(而不是運行完成)時,我需要執行額外的工作。 – 2013-04-04 00:18:32
@ fatcat111使用布爾標誌。例如,在'try'結尾處設置'$ didcomplete = $ true',並用'if($ didcomplete){Write-Host「結束工作。 }''finally'裏面' – 2014-03-15 18:48:55
不幸的是,如果PowerShell控制檯窗口關閉,finally塊不會被執行。 – 2017-12-29 10:11:48
還有上$PSCmdlet
一個Stopping
屬性,可以用於此目的。
即使每個[PowerShell/PowerShell#6322](https://github.com/PowerShell/PowerShell/issues/6322)停止,「Stopping」也是「false」。 – alx9r 2018-03-06 17:46:51
哇,這太瘋狂了。我最終只是將腳本重寫爲C#中的cmdlet,因此我可以覆蓋Stop()。 – 2009-11-25 06:43:14