PowerShell中如何提取文本字段并拼接为指定输出格式
PowerShell 文本字段拼接实现方案
你原有脚本的核心问题是逐行独立匹配筛选,没有把同一条目下的Name和Type字段值做关联,因此无法完成拼接。以下提供两种可直接运行的实现:
方案1:按文本块分割处理(适配块结构文本最直观)
$file = "D:\XXX\test.txt" # 一次性读取全文件,按连续空行分割为独立条目块,过滤空内容块 $entries = (Get-Content $file -Raw) -split '\r?\n\s*\r?\n' | Where-Object { $_ -match '\S' } foreach ($entry in $entries) { # 正则提取当前块内Name字段冒号后的值,自动忽略多余空格 $name = if ($entry -match '(?m)^\s*Name\s*:\s*(.+?)\s*$') { $matches[1] } # 正则提取当前块内Type字段冒号后的值 $type = if ($entry -match '(?m)^\s*Type\s*:\s*(.+?)\s*$') { $matches[1] } if ($name -and $type) { Write-Output "$name/$type" } }
方案2:逐行遍历暂存值(大文件处理效率更高)
$file = "D:\XXX\test.txt" $tempName = $null $tempType = $null foreach ($line in Get-Content $file) { # 匹配到Name行时暂存值 if ($line -match '^\s*Name\s*:\s*(.+?)\s*$') { $tempName = $matches[1] } # 匹配到Type行时暂存值 elseif ($line -match '^\s*Type\s*:\s*(.+?)\s*$') { $tempType = $matches[1] } # 两个字段值都收集完成后拼接输出,清空暂存变量等待下一组 if ($tempName -and $tempType) { Write-Output "$tempName/$tempType" $tempName = $null $tempType = $null } }
说明
- 两种方案均为PowerShell原生实现,无需调用
findstr等外部命令,自动兼容键名与冒号之间空格数量不统一的格式问题 - 方案1逻辑更贴合当前文件按空行分块的结构,代码可读性更高
- 方案2为逐行流式处理,加载GB级大文件时内存占用更低,执行效率更好
内容的提问来源于stack exchange,提问作者TomTom30
相关产品推荐
相关产品推荐

