在 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
不支持替代 \e
和 3
)
\[
是转义序列的第二个字符
[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
等特殊字符。
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
不支持替代\e
和3
)\[
是转义序列的第二个字符[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
等特殊字符。