PowerShell脚本增强:提取Operator实体的Id与RatedOI
解决方案:PowerShell脚本修改方案
首先,别用正则处理JSON——这是新手最容易踩的坑,PowerShell原生支持JSON解析,比正则靠谱100倍,还能避免匹配不全、格式变动失效的问题。以下是针对你需求的具体实现:
核心思路
- 先把JSON内容转换成PowerShell对象,遍历实体列表
- 实时跟踪每个
Operator实体的前置Id - 定位
Operator实体后第一个带RatedOI的条目 - 直接跳过带有
Characteristics: []的Operator实体
修改后的脚本示例
# 读取JSON文件(或直接传入JSON字符串) $jsonContent = Get-Content -Path "your-target-file.json" -Raw | ConvertFrom-Json # 初始化变量跟踪前置Id、存储结果 $lastValidId = $null $outputResults = @() # 遍历所有实体 foreach ($entity in $jsonContent.Entities) { # 更新前置Id:只要当前实体有Id,就覆盖为最新值 if ($entity.Id) { $lastValidId = $entity.Id } # 检查当前实体是否为Operator if ($entity.EntityType -eq "Operator") { # 跳过带有Characteristics数组的情况 if ($entity.Characteristics -is [array]) { continue } # 查找该Operator之后第一个带RatedOI的实体 $firstRatedOI = $jsonContent.Entities | Where-Object { $_.PSObject.Properties.Name -contains "RatedOI" -and $jsonContent.Entities.IndexOf($_) -gt $jsonContent.Entities.IndexOf($entity) } | Select-Object -First 1 # 收集有效结果 if ($lastValidId -and $firstRatedOI) { $outputResults += [PSCustomObject]@{ PrecedingId = $lastValidId RatedOI = $firstRatedOI.RatedOI } } } } # 输出最终结果 $outputResults
关键说明
- 弃用正则:JSON的嵌套结构、换行/空格变动都会让正则匹配失效,用
ConvertFrom-Json转成对象是最稳妥的方案 - 前置Id跟踪:遍历过程中随时更新
$lastValidId,确保遇到Operator时拿到的是紧邻上方的第一个有效Id - 精准跳过无效项:通过
-is [array]直接判断Characteristics是否为数组类型,符合条件则跳过 - 全量匹配结果:遍历所有实体并收集符合要求的条目,不会只返回首个匹配项
验证注意事项
如果你的JSON示例中有两个符合条件的Operator实体,运行脚本会返回两条结果。若仍有问题,检查JSON结构是否正确:确保Entities是数组类型,实体属性名称(如Id、EntityType、RatedOI)的大小写和脚本一致(PowerShell默认区分大小写)
内容的提问来源于stack exchange,提问作者BigSmooth82
相关产品推荐
相关产品推荐

