保留管道输出的颜色

时间:2016-08-31 09:07:40

标签: powershell terminal ansi-colors

我有这个非常简单的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转换)在这里不适用,因为这需要将数据写入控制台而不是管道。

3 个答案:

答案 0 :(得分:3)

据我所知,您无法保留git status -s输出的颜色,或通过StdIn传输到PowerShell的任何其他命令输出。通过StdIn传输到PowerShell功能的文本的颜色信息已丢失'

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

控制台使用System.IO.StreamReader通过StdIn接受输入。在PowerShell / ISE中尝试此命令[Console]::In | Get-Member

答案 1 :(得分:0)

如果要将o / p写入控制台[主机 - 准确]。您可以使用Write-Host cmdlet,它提供“前景”和“背景”属性,您可以使用它来设置您选择的颜色。

答案 2 :(得分:0)

  • 支持彩色输出的实用程序(命令行程序)通常省略颜色代码,当它们的stdout未连接到终端时 (控制台),例如当输出重定向到文件或通过管道发送时。

    • 如果意图是编程处理输出(而不是在终端中显示),则不应该使用格式化指令污染数据。
  • 在这种情况下,您必须使用特定于实用程序的选项,支持IF ,以强制无条件使用着色

PowerShell 通过管道传递颜色代码,因此从具有git存储库的目录执行的以下内容应生成彩色输出。

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

单词master(或任何分支处于活动状态)应出现在绿色中。

-c color.status=always技术的answer已经更新,因为您链接到它,所以我怀疑早期的表单在强制无条件彩色输出方面无效。