代码之家  ›  专栏  ›  技术社区  ›  Daniel.zZ

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

  •  2
  • Daniel.zZ  · 技术社区  · 7 年前

    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

    click to view image

    2 回复  |  直到 7 年前
        1
  •  7
  •   Ansgar Wiechers    7 年前

    你可以试试这样:

    ... | 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'
    
        2
  •  4
  •   Shubhanshu Rastogi    5 年前

    代替 命令作为Powershell 3.0的一部分提供。powershell使用正则表达式来帮助替换ANSI颜色代码。(对于UNIX,可以使用 sed公司

    使用正则表达式

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

    [1;35m , [0m[1;3 ^[[37mABC