PowerShell从TeamCity构建日志提取指定内容失败如何解决
问题根因
你写的两段正则返回空值的核心原因是:默认PowerShell使用的.NET正则引擎中,.元字符不匹配换行符,而你要提取的百分比表内容跨了多行,所以自然匹配不到结果。
修复后的完整实现代码
# 读取日志内容,-Raw参数会把整个日志读为单个字符串,不要省略该参数 $logContent = Get-Content "你的构建日志本地路径.log" -Raw # 1. 提取Percentiles表格 $percentilesPattern = '(?<=Percentiles:\r?\n)(.*?)(?=\r?\n.*Request label stats:)' $percentilesTable = [regex]::Match($logContent, $percentilesPattern, [Text.RegularExpressions.RegexOptions]::Singleline).Value.Trim() # 2. 提取Request Label Stats表格 $labelStatsPattern = '(?<=Request label stats:\r?\n)(.*?)(?=\r?\n.*Ending data feeding)' $labelStatsTable = [regex]::Match($logContent, $labelStatsPattern, [Text.RegularExpressions.RegexOptions]::Singleline).Value.Trim() # 3. 提取Online Report Link在线报告链接 $linkPattern = '(?<=Online report link: )https?://\S+' $onlineReportLink = [regex]::Match($logContent, $linkPattern).Value.Trim() # 结果输出验证 Write-Host "===== Percentiles表格 =====" $percentilesTable Write-Host "`n===== Request Label Stats表格 =====" $labelStatsTable Write-Host "`n===== 在线报告链接 =====" $onlineReportLink
关键修改说明
- 新增了
[Text.RegularExpressions.RegexOptions]::Singleline参数开启单行模式,开启后.可以匹配包括换行在内的所有字符,满足跨行匹配的需求。也可以直接在正则开头加(?s)内联修饰符实现相同效果,写法更简洁,示例:$percentilesPattern = '(?s)(?<=Percentiles:\r?\n)(.*?)(?=\r?\n.*Request label stats:)' $percentilesTable = [regex]::Match($logContent, $percentilesPattern).Value.Trim() - 正则中增加了
\r?\n兼容Windows和Unix两种换行格式,避免不同系统生成的日志匹配失败 - 非捕获组的边界匹配做了精度优化,避免提取到多余的日志前缀内容
内容的提问来源于stack exchange,提问作者born2Learn
相关产品推荐
相关产品推荐

