2009-11-10 90 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