2012-04-16 117 views
9

这可能吗?我终于决定开始建立我的个人.NET开发环境,以更接近地模仿我将如何建立* NIX开发环境,这意味着认真学习Powershell。如何在PowerShell中捕获信号?

我目前正在编写一个函数,通过文件系统递归,设置工作目录,因为它为了构建的东西。让我困扰的一件事是,如果我按Ctrl + C退出该功能,则无论脚本最后一次出现在哪里,都会使我无法工作。我试过设置一个trap块,它在运行时将目录更改为起始点,但这似乎只是针对Exception而设置(并触发)。

如果这是在Unix中有根的语言,我会为SIGINT设置一个信号处理程序,但在Powershell中找不到类似的搜索。放在我的.NET上限上,我想象着某种事件,我可以附加一个处理程序,如果我不得不猜测,这将是一个事件$host,但我找不到任何规范文档System.Management.Automation.Internal.Host.InternalHostUserInterface,没有什么轶事,我已经能够搜索有帮助。

也许我错过了一些完全明显的东西?

回答

16

你的意思是这样的吗?

try 
{ 
    Push-Location 
    Set-Location "blah" 
    # Do some stuff here 
} 

finally 
{ 
    Pop-Location 
} 

查看文档here.特别是那款:“finally块无论try块是否遇到终止错误语句运行Windows PowerShell运行finally块中的脚本终止之前或之前,在当前块超出范围内,即使使用CTRL + C停止脚本,也会运行Finally块。如果Exit关键字停止Catch块内的脚本,则最后一个块也会运行。

+2

最后一个直接的解决方案来清理CTRL-C终止工作(: – Callahan 2013-08-19 12:50:48

5

这将处理控制台kepboard输入。如果在循环过程中按下控件C,您将有机会处理该事件。在示例代码中,打印警告并退出循环。

[console]::TreatControlCAsInput = $true 
dir -Recurse -Path C:\ | % { 
    # Process file system object here... 
    Write-Host $_.FullName 

    # Check if ctrl+C was pressed and quit if so. 
    if ([console]::KeyAvailable) { 
     $key = [system.console]::readkey($true) 
     if (($key.modifiers -band [consolemodifiers]"control") -and ($key.key -eq "C")) { 
      Write-Warning "Quitting, user pressed control C..." 
      break 
     } 
    } 
+0

不从ISE工作,但完美在一个正常的PowerShell窗口 – Froosh 2014-04-29 02:53:55