13

这可能吗?我最终决定开始设置我的个人 .NET 开发环境,以更接近地模仿我设置 *NIX 开发环境的方式,这意味着认真学习 Powershell。

我目前正在编写一个通过文件系统递归的函数,设置工作目录以便构建东西。困扰我的一件小事是,如果我 Ctrl+C 退出该函数,它将让我离开脚本最后的位置。我尝试设置一个trap块,在运行时将 dir 更改为起点,但这似乎仅适用于(并触发)异常。

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

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

4

2 回答 2

21

你的意思是这样的吗?

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

finally
{
    Pop-Location
}

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

于 2012-04-16T18:55:56.170 回答
6

这处理控制台记事板输入。如果在循环期间按下控制 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
        }
    }
于 2012-04-16T19:11:06.830 回答