如何在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