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

Dan*_*.zZ 0 unicode powershell cmdlets

无论如何,PowerShell是否可以在输出到文件之前先输出不含ANSI控制字符(例如颜色控制,ex [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
Run Code Online (Sandbox Code Playgroud)

输出在PowerShell终端中以颜色正确显示(我用过chcp,不起作用)

点击查看图片

Shu*_*ogi 7

对于 Windows 系统,可以使用Powershell 3.0 中提供的Replace命令。powershell 使用正则表达式来帮助替换 ANSI 颜色代码。(如果是 UNIX,可以使用sed命令)

使用正则表达式

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

'\x1b\[[0-9;]*m'
Run Code Online (Sandbox Code Playgroud)
  • \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


Ans*_*ers 5

您可以尝试这样的事情:

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

或将其包装在函数中:

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'
Run Code Online (Sandbox Code Playgroud)