代码之家  ›  专栏  ›  技术社区  ›  JamesThomasMoon

为powershell stdout标准错误着色

  •  0
  • JamesThomasMoon  · 技术社区  · 4 年前

    我该如何将标准件着色, stdout 以及标准误差, 标准错误 ,在powershell终端中?

    也就是说,在典型的powershell终端中运行任何命令行程序。程序写入 stdout 标准错误 程序不应该被修改或知道颜色设置。
    我想要 stdout 成为白色和 标准错误 成为红色。

    0 回复  |  直到 4 年前
        1
  •  3
  •   radrow    2 年前

    您可以利用这样一个事实,即在大多数常见情况下,标准输出通常会流式传输,而且重定向不会忘记初始句柄。因此,样品溶液应

    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 在这里,这个脚本覆盖了所有的颜色。