在 PowerShell 输出到文件之前修复 ANSI 控制字符

Fix ANSI control characters before PowerShell output to a file

PowerShell 是否可以输出没有 ANSI 控制字符(如颜色控制)的文件,e.x。 [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,不工作)

您可以尝试这样的操作:

... | 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'

对于 windows 系统,可以使用作为 Powershell 3 的一部分提供的 Replace 命令。0.The powershell 使用正则表达式来帮助替换 ANSI 颜色代码。 (如果是 UNIX,可以使用 sed 命令)

使用正则表达式

下面是用于删除 ANSI 颜色代码的标准正则表达式(可用于 Linux 和 windows 两者)

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

最终命令

我在这里输出 docker 的日志到日志 file.One 可以对其他命令做同样的事情

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

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

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