保留管道输出的颜色

Preserve color from piped output

我有一个非常简单的 powershell 脚本,它在每一行前面加上一个数字。

function number
{    
    $i = 0;
    foreach($line in $input)
    {
        [string]$i + ":" + $line
        ++$i
    }
}

我希望此函数能够保留输入的颜色。例如,如果我执行以下命令,颜色将丢失:

git status -s | number

正在执行

git status -s

给我一个漂亮的彩色输出。我可以在我的 powershell 函数中更改什么来完成此操作。

请注意,我已经尝试告诉 git 始终使用 this question 答案中的信息输出颜色,所以我认为是我这边忽略了颜色。

这不是 the question this one was previously marked a duplicate of 的副本。

我看过那个问题,它实际上是关于如何防止 MSBuild 写入标准错误而不是标准输出,这会阻止在这种情况下显示颜色。这个问题和这个问题唯一相似的地方是标题。那里的另一个答案(使用 HTML 转换)不适用于此处,因为它要求将数据写入控制台而不是通过管道传输。

如果您正在将 o/p 写入控制台[主机 - 准确地说]。您可以使用 Write-Host cmdlet,它提供了 "foreground" 和 "background" 属性,您可以使用它们来设置您选择的颜色。

据我所知,您无法保留 git status -s 输出的颜色,也无法保留通过 StdIn 传输到 PowerShell 的任何其他命令输出。通过 StdIn 传输到 PowerShell 函数的文本的颜色信息是 'lost'.

我能想到的重新添加颜色的唯一方法是执行 RegEx 匹配或基于位置的着色,对每个着色部分使用多个 Write-Host "line section" -ForegroundColor COLOR -NoNewline

控制台使用 System.IO.StreamReader 通过 StdIn 接受输入。在 PowerShell/ISE.

中尝试此命令 [Console]::In | Get-Member
  • 支持彩色输出的实用程序(command-line 程序)通常在其标准输出未连接到终端(控制台),例如当输出被重定向到文件或通过管道发送时。

    • 如果意图是程序化输出处理(而不是在终端中显示),我们的想法是不要用格式化指令污染数据。
  • 在那种情况下你必须使用utility-specific选项,如果支持为了强制无条件 使用着色.

PowerShell 确实通过管道传递颜色代码,所以像下面这样的东西,从带有[=11=的目录执行] 存储库,应该产生彩色输出。

PS> git -c color.status=always status -b --short | % { $i=0 } { "$((++$i)): $_" }
1: ## master

单词 master(或任何活跃的分支)应该出现在 green 中。

采用 -c color.status=always 技术的 answer 自您链接到它后已更新,因此我怀疑早期的形式在强制无条件彩色输出方面根本无效。