如何在PowerShell中捕获信号?

时间:2012-04-16 17:49:04

标签: powershell

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

我正在编写一个函数,它通过文件系统进行递归,设置工作目录,以便构建东西。困扰我的一件小事是,如果我将Ctrl + C排除在函数之外,它会让我离开脚本最后的位置。我已经尝试设置一个trap块,在运行时将dir更改为起始点,但这似乎只是在Exception上打算(和触发)。

如果这是一种在Unix中具有root权限的语言,我会为SIGINT设置一个信号处理程序,但我在Powershell中找不到任何类似的搜索。戴上我的.NET上限,我想象有一些事件,我可以附加一个处理程序,如果我不得不猜测,它是$host的事件,但我找不到System.Management.Automation.Internal.Host.InternalHostUserInterface的任何规范性文档,并且我能够搜索的任何轶事都没有帮助。

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

2 个答案:

答案 0 :(得分:19)

你的意思是这样吗?

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

finally
{
    Pop-Location
}

请参阅文档here.特别是该段落:“无论Try块是否遇到终止错误,都会运行Finally块语句.Windows PowerShell在脚本终止之前或当前块之前运行Finally块超出范围。即使您使用CTRL + C来停止脚本,也会运行Finally块。如果Exit关键字在Catch块中停止脚本,则还会运行Finally块。

答案 1 :(得分: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
        }
    }