如何基于起始行拆分文本为多行扫描记录并保留起始行?
处理扫描记录拆分与解析问题
需求:将包含多条扫描记录的文本拆分为独立条目(每条以Root Scan Path开头,Suspicious Files结尾),再将每条记录解析为PSCustomObject。原拆分方法$String -Split "Root Scan Path: C:\"会丢失作为分隔符的开头行,需调整实现方式。
正确拆分扫描记录
使用正则正向前瞻实现拆分,保留每条记录的Root Scan Path开头行:
# 拆分文本为独立扫描记录,过滤空条目 $scanRecords = $String -Split '(?=Root Scan Path:)' | Where-Object { $_ -match '\S' }
- 正则
(?=Root Scan Path:)表示匹配**后面紧跟Root Scan Path:**的位置,拆分时不会消耗开头行内容 Where-Object { $_ -match '\S' }用于过滤拆分后产生的空字符串
将记录解析为PSCustomObject
遍历每条拆分后的记录,提取键值对并转换为自定义对象:
$scanObjects = foreach ($record in $scanRecords) { $props = @{} # 拆分单条记录为行,过滤空行 $lines = $record -split "`n" | Where-Object { $_ -match '\S' } foreach ($line in $lines) { # 按第一个': '拆分键与值,保留值中的冒号(如果有) $key, $value = $line -split ': ', 2 $props[$key] = $value } [PSCustomObject]$props }
-split ': ', 2确保仅拆分第一个冒号加空格,避免值中包含冒号时出错- 自动处理空值(如示例中第二条记录的
End Time)
验证结果
输出$scanObjects即可看到结构化的扫描记录:
$scanObjects
示例输出:
Root Scan Path : C:\ Scan ID : 03307ad8-1a59-7d4e-8dfe-28864c9d1bc2 Status : Completed Initiated from : User Start Time : Monday, October 23, 2023 9:24:18 PM End Time : Monday, October 23, 2023 9:34:00 PM Scanned Files : 38311 Unsupported Files : 229479 Traversed Files : 321202 Total Files : 267790 Suspicious Files : 0 Root Scan Path : C:\ Scan ID : f32a64b0-56f5-664c-bf37-a7b120f759d8 Status : Running Initiated from : User Start Time : Tuesday, October 24, 2023 6:20:45 PM End Time : Scanned Files : 0 Unsupported Files : 0 Traversed Files : 0 Total Files : 0 Suspicious Files : 0
内容的提问来源于stack exchange,提问作者xeric080
相关产品推荐
相关产品推荐

