繁体   English   中英

如何在PowerShell中捕获信号?

[英]How do I trap signals in PowerShell?

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

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

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

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

你的意思是这样的吗?

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

finally
{
    Pop-Location
}

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

这会处理控制台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
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM