管道输出保留颜色

5
我有一个非常简单的PowerShell脚本,它会在每一行前加上一个数字。
function number
{    
    $i = 0;
    foreach($line in $input)
    {
        [string]$i + ":" + $line
        ++$i
    }
}

我希望这个函数能够保留输入的颜色。例如,如果我执行下面的命令,颜色会丢失:

git status -s | number

执行时

git status -s

给我一个漂亮的输出。我应该修改我的PowerShell函数以达成这个目标。
注意,我已经尝试过告诉Git总是在这个问题的答案中输出颜色,所以我认为是我的一方忽略了颜色。
这不是此问题先前标记为重复的问题的重复内容。
我已经看到了那个问题,它实际上是关于如何防止MSBuild将数据写入标准错误而不是标准输出,这样会阻止颜色显示。那个问题和这个问题唯一相似的地方就是标题。那里的另一个回答(带有HTML转换)不适用于本题,因为那需要数据被写入控制台而不是管道。
3个回答

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

    • 这样做的原因是为了避免在意图进行编程处理而非在终端中显示的情况下,将数据与格式化指令混合。
  • 在这种情况下,您必须使用特定于实用程序的选项(如果受支持)来强制无条件使用着色。

PowerShell通过管道传递颜色代码,因此像以下示例一样,在具有git存储库的目录中执行的命令将产生彩色输出。

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

单词master(或任何活动的分支)应该以绿色显示。

答案中提到的-c color.status=always技巧已经更新,因此我怀疑早期版本并不有效地强制进行无条件的彩色输出。


一如既往,Klement先生的回答非常出色!有没有一种简单的方法来“伪造”终端,用于那些没有像--color=always这样的参数的应用程序?我正在使用Tee-Object-Variable xxx参数,但是几乎每个我以这种方式运行的应用程序都无法显示颜色。 - undefined
谢谢,@aetonsi。我只能想到适用于类Unix环境(包括Windows上的WSL)的解决方案,使用script实用程序;例如:(script -qc 'ls --color=auto /mnt/c/windows' /dev/null) | Tee-Object -Variable out--color=auto用于触发在管道中通常被抑制的着色)。 - undefined

4
据我所知,无法保留通过git status -s或任何其他命令输出的颜色信息,并通过StdIn输入到PowerShell中的文本的颜色信息会丢失。
我能想到的唯一添加颜色的方法是使用正则表达式匹配或基于位置的着色,对于每个有颜色的部分使用多个Write-Host "line section" -ForegroundColor COLOR -NoNewline
控制台使用System.IO.StreamReader通过StdIn接受输入。在PowerShell / ISE中尝试此命令[Console] :: In | Get-Member

不幸的是,情况似乎是这样的。很遗憾我在其他Shell(bash)中找到了一些答案,在那里它是可能的。 - Roy T.
1
基于正则表达式的着色功能很有趣,但请注意,PowerShell确实会传递颜色代码,您只需要确保输入命令即使将其stdout连接到管道中也会发出它们,这通常需要一个(特定于实用程序的)选项,例如在Roy的命令中使用-c color.status=always - mklement0

0

如果你想将输出写入控制台[准确来说是主机],你可以使用Write-Host命令,它提供了“前景”和“背景”属性,可以用于设置你选择的颜色。


2
这只允许我设置自己的颜色,而不能重复使用Git输出的颜色。 - Roy T.

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