如何读取、判断并过滤PowerShell管道输出内容的前景色
解决方案
你之前的写法无法生效,是因为外部CLI程序的颜色输出是通过向控制台写入ANSI转义序列实现的,管道传递的输出内容是纯字符串,本身不携带ForegroundColor这类颜色属性,只有PowerShell原生格式化的输出对象才会附带该属性。
可以通过匹配过滤ANSI颜色转义序列的方式实现需求,以下是两种常用方案:
方案1:过滤所有包含黄色输出的行
匹配包含黄色前景色转义序列的行直接排除,适合需要完全屏蔽黄色内容行的场景:
# 匹配标准黄色ANSI转义码,如需同时屏蔽亮黄色可修改为 [char]27 + '\[(33|93)m' $yellowAnsiPattern = [char]27 + '\[33m' some-cli.exe | Where-Object { $_ -notmatch $yellowAnsiPattern }
方案2:保留行内容,仅删除黄色标记的部分
如果不需要删除整行,仅希望抹去其中的黄色内容,可使用正则替换掉黄色转义序列包裹的内容:
# 匹配黄色转义序列包裹的所有内容 $yellowContentPattern = [char]27 + '\[33m.*?' + [char]27 + '\[0m' some-cli.exe | ForEach-Object { $_ -replace $yellowContentPattern, '' }
注意事项
- 部分旧版CLI默认在非交互场景下会禁用颜色输出,可添加对应参数强制开启颜色:
choco追加--color参数msbuild追加/clp:ForceConsoleColor参数nuget追加--color always参数
- 如果你使用的是PowerShell 5.1及以下版本,需要先开启虚拟终端支持才能正确识别ANSI转义序列,可在脚本开头添加如下代码:
$Host.UI.RawUI.ForegroundColor = $Host.UI.RawUI.ForegroundColor # 触发虚拟终端初始化
内容的提问来源于stack exchange,提问作者Shaun Luttin
相关产品推荐
相关产品推荐

