如何在PowerShell中捕获信号?

Mar*_*ger 10 powershell

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

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

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

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

Dav*_*ant 21

你的意思是这样的吗?

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

finally
{
    Pop-Location
}
Run Code Online (Sandbox Code Playgroud)

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

  • 最后一个直接的解决方案来清理CTRL-C终止的Job(: (3认同)

And*_*ndi 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
        }
    }
Run Code Online (Sandbox Code Playgroud)