在将PowerShell输出写入文件之前,需要修复ANSI控制字符。

5
有没有办法让PowerShell输出文件时不包含ANSI控制字符,例如颜色控制的[1;xxm[xm],在输出到文件之前?
[1;35mStarting selenium server... [0m[1;35mstarted - PID: [0m 22860

[0;36m[Signin Test] Test Suite[0m
[0;35m================================[0m

Running:  [0;32mstep 1 - launch the browser[0m
[1;35m[40mINFO[0m [1;36mRequest: POST /wd/hub/session[0m

输出在PowerShell终端正确显示颜色,(我已经使用了chcp,但不起作用)

点击查看图片

2个回答

8
您可以尝试类似以下的方法:

您可以尝试类似以下的方法:

... | ForEach-Object {
    $_ -replace '\[\d+(;\d+)?m' | Add-Content 'C:\path\to\output.txt'
    $_
}

或者将其封装到函数中:
function Tee-ObjectNoColor {
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
        [string]$InputObject,

        [Parameter(Position=1, Mandatory=$true)]
        [string]$FilePath
    )

    Process {
        $InputObject -replace '\[\d+(;\d+)?m' | Add-Content $FilePath
        $InputObject
    }
}

... | Tee-ObjectNoColor -FilePath 'C:\path\to\output.txt'

感谢你的正则表达式和tee函数。我将更深入地了解cmdlets。有没有办法消除所有奇怪的Unicode字符,因为输出文件还有其他字符 ΓåÆ,我必须手动在正则表达式中包含它们 |[\u001B\u0393\u00E5\u00C6] - Daniel.zZ
可能更简单的方法是定义非奇怪字符,然后删除其他一切。 - Ansgar Wiechers
请注意,这将删除可见字符,但在方括号之前的转义字符将被保留。该转义字符是不可打印的,因此它将是看不见的,但一些下游文本查看器将把该字符呈现为一个模糊的方块。此外,此处包含的正则表达式仅适用于具有一或两个元素的ansi代码,并且会跳过类似[1;35;3;38m的代码。 - Ro Yo Mi

7

对于Windows系统,可以使用作为Powershell 3.0一部分的Replace命令。Powershell使用正则表达式来替换ANSI颜色代码。(在UNIX中,可以使用sed命令)

使用正则表达式

下面是用于删除ANSI颜色代码的标准正则表达式(可在Linux和Windows中使用)

'\x1b\[[0-9;]*m'
  • \x1b (或 \x1B) 是转义特殊字符(sed不支持替代字符\e\033)。
  • \[是转义序列的第二个字符。
  • [0-9;]*是颜色值的正则表达式。
  • m是转义序列的最后一个字符。

最终命令

我将docker的日志输出到日志文件中。其他命令也可以采用同样的方式。

docker logs container | ForEach-Object { $_ -replace '\x1b\[[0-9;]*m','' }| Out-File -FilePath .\docker-logs.log

  • ForEach-Object引用流中的每个对象,$_引用当前对象。

以上命令将从输出流中删除特殊字符[1;35m[0m[1;3^[[37mABC


这个命令无法运行。 - mammadalius
@mammadalius 在提出这些问题时最好提供更多的上下文和信息,而不仅仅是“它不起作用”。 - Ro Yo Mi

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