早上好。我是 Stack Overflow、Powershell、RegEx 新手。
我有兴趣在 Powershell 中对以下程序进行增强。截至目前,该程序在 ForEach 中搜索“IHUR”的实体类型。一旦找到“IHUR”,该程序就会产生两个感兴趣的对象:id 和 RatedOI。
我有一个复杂的 JSON 文件,其中 id、RatedOI 和 IHUR 在 JSON 文件中出现多次。我刚刚意识到 IHUR 在 JSON 中只出现一次。由于当前程序仅返回 id 和 RatedOI 的第一次出现,因此我希望对其进行增强。
当找到 entityType“Operator”时,仅捕获第一个 ID 出现,物理位置位于其上方 1 行(向上扫描?)
当找到 entityType“Operator”时,仅捕获其下方的第一个 RatedOperatorIndicator(向下扫描?)(RatedOI 可以在下面 1 行或多行找到)
如果找到以下字符串(位于 JSON 中的不同行上,则不会产生任何结果:
"EntityType": "Operator", "Characteristics": [
请注意括号,而不是花括号
预期输出
id RatedIO
---- ------
833e2a7f-c173-4062-9cd6-2196432e0001 False
6fe06340-072f-49b2-8d5a-449e3db80002 True
实际产量
Id RatedOI
---- ------
833e2a7f-c173-4062-9cd6-2196432e0001 False
有人可以查看这个示例 JSON 文件和 PowerShell 代码并提供反馈吗?
JSON 代码
{
"id": "4fd338f7-746b-420b-9d7e-b41709e9a641",
"RD": {
"PDR": []
},
"TimeStamp": "2025-02-14T16:55:20.1433467Z",
"NNTl": {
"CD": [
{
"EntityType": "Occurrence",
"Characteristics": [
"OFGE",
"ORI"
],
"Cardinality": "Many"
},
{
"EntityType": "Operator",
"Characteristics": [
"ADL",
"ERO"
],
"Cardinality": "Many"
}
],
"RRXC": true
},
"EntitiesData": {
"Entities": [
{
"Id": "b0000000-0000-0000-0000-00000000000b",
"EntityType": "IHUR",
"Ordinal": 0,
"Characteristics": {
"PBIL": {
"StringValue": "DDDD"
}
}
},
{
"Id": "833e2a7f-c173-4062-9cd6-2196432e0001",
"EntityType": "Operator",
"Ordinal": 0,
"Characteristics": {
"FN": {
"StringValue": "Da"
},
"RatedOI": {
"BoolValue": false
},
"fdfdf": {
"DDFDF": "SDFDS43R5"
}
},
"EntityCreationDateTime": "2025-02-12T19:42:59.2852792Z"
},
{
"Id": "6fe06340-072f-49b2-8d5a-449e3db80002",
"EntityType": "Operator",
"Characteristics": {
"Deleted": {
"StringValue": "0"
},
"RatedOI": {
"BoolValue": true
}
}
}
]
},
"OR": "FFFFF01"
}
Powershell 代码,基于此答案:
Set-Location C:\Users\A187515\Downloads\
$file = Get-ChildItem -Path C:\Users\A187515\Downloads\ -Filter *.json | Sort-Object LastAccessTime -Descending | Select-Object -First 1
(Get-Content -Raw "$file" | ConvertFrom-Json) | ForEach-Object {
$useNext = $false
foreach ($entity in $_.entitiesData.entities) {
if ($entity.entityType -eq 'IHUR') {
$useNext = $true
}
elseif ($useNext) {
$entity | Select-Object `
id,
@{ Name = 'RatedOI'; Expression = {
$_.characteristics.RatedOI.boolValue }
}
#break
$useNext = $false
}
}
}