使用颜色突出显示PowerShell的标准输出和错误输出

8

我该如何在PowerShell终端中为标准输出stdout和标准错误stderr添加颜色?

也就是说,在典型的PowerShell终端中运行任何命令行程序。该程序将写入stdoutstderr。该程序不应被修改或意识到颜色设置。
我想让stdout变成白色,stderr变成红色。

1个回答

3

您可以利用标准输出通常在大多数情况下正常流式传输的事实,以及重定向不会忘记初始句柄。因此,一个示例解决方案是:

  1. 将所有句柄重定向到标准句柄(因为它只对管道有用)
  2. 通过检查其类型,找出条目的原始句柄
  3. 重新打印条目(分别根据句柄进行着色)

在我的测试中,这个方法效果很好:

function Color {
    param (
        [Parameter(Mandatory)]
        [scriptblock]$Command,

        [System.ConsoleColor]$OutColor = [System.ConsoleColor]::White,
        [System.ConsoleColor]$ErrColor = [System.ConsoleColor]::Red,
        [System.ConsoleColor]$WrnColor = [System.ConsoleColor]::Yellow,
        [System.ConsoleColor]$VrbColor = [System.ConsoleColor]::Magenta,
        [System.ConsoleColor]$InfColor = [System.ConsoleColor]::Blue
    )

    & $command *>&1 | ForEach-Object {
        $PrintColor =
            if     ($_ -is [System.Management.Automation.ErrorRecord]) { $ErrColor }
            elseif ($_ -is [System.Management.Automation.WarningRecord]) { $WrnColor }
            elseif ($_ -is [System.Management.Automation.VerboseRecord]) { $VrbColor }
            elseif ($_ -is [System.Management.Automation.InformationRecord]) { $InfColor }
            else {$OutColor}
        Write-Host -ForegroundColor $PrintColor $_
    }
}

测试:

Color {
  Write-Output OUT;
  Write-Error ERR;
  Write-Warning WRN;
  Write-Verbose VRB;
  Write-Information INF;
  Write-Host -ForegroundColor Black HOST;
  1234
}

输出结果看起来像这样(适合色盲人群编辑):
OUT  // white
ERR  // red
WRN  // yellow
INF  // blue
HOST // blue
1234 // white

顺便提一下:Write-Host 在此处被强制视为 Information,因此此脚本会覆盖所有着色。


解释了概念和解决方案,清晰明了。优雅的例子。非常好。 - Victor Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接