PowerShell函数开发:检测JSON中是否包含{TBD}字符串
PowerShell检查JSON中是否存在{TBD}字符串的方法
需求描述
我需要编写一个PowerShell函数,扫描JSON文件检查其中是否存在"{TBD}"字符串。若不存在该字符串,输出"JSON did validate";若存在,则输出"JSON did not validate"。我原本打算使用正则表达式函数来查找该字符串,但并非PowerShell专家,希望有人能审阅我编写的代码并给出正确语法建议。
示例JSON
{ "zrp_ConnectionStrings": [ { "ConnectionName": "application-direct", "Provider": "Sysrepublic.Secure.Core.DataProviders.MssqlDatabaseProvider, Sysrepublic.Secure.Core" } ], "zrp_ConfigurationItem": [ { "Name": "CPF.Core.EmailToken.{LOGONURL}", "DataType": "Text", "Value": "https://xlots.apprissretailcloud.com/zecure/cpf/auth/logon" }, { "Name": "sso.samlCertificate", "DataType": "Text", "Value": "{TBD}" } ] }
我编写的代码
$json = Get-Content -Raw -Path C:\secure_ConfigurationItem.json $pattern = '"Value": "(.*?)",' $ListNm= ( ([regex]::Matches($json,$pattern) ).groups | Where-Object {$_.Name -EQ 'TBD'}).value
代码问题分析与修正
你的代码存在几个关键问题:
- 正则捕获组使用错误:
Where-Object {$_.Name -EQ 'TBD'}中的$_.Name指的是正则捕获组的名称(比如第1个捕获组名称为1),并非匹配到的内容,无法筛选出包含{TBD}的结果。 - 正则未转义特殊字符:
{TBD}中的{}属于正则元字符,直接使用会导致匹配逻辑错误。
下面提供几种更可靠的实现方式:
方法1:直接扫描文件内容(简单高效)
如果只需要检查"{TBD}"字符串是否存在,不需要考虑其所在字段,直接用通配符匹配即可:
function Test-JsonForTbd { param( [Parameter(Mandatory=$true)] [string]$Path ) $jsonContent = Get-Content -Raw -Path $Path if ($jsonContent -like '*"{TBD}"*') { Write-Host "JSON did not validate" } else { Write-Host "JSON did validate" } } # 调用示例 Test-JsonForTbd -Path "C:\secure_ConfigurationItem.json"
方法2:解析JSON后检查(严谨可靠)
如果需要确保{TBD}只出现在特定字段或避免误匹配(比如其他字符串包含类似子串),可以先将JSON转为PowerShell对象,再递归检查所有值:
function Test-JsonForTbd { param( [Parameter(Mandatory=$true)] [string]$Path ) try { $jsonObject = Get-Content -Raw -Path $Path | ConvertFrom-Json # 递归遍历所有属性值,查找{TBD} function Find-Tbd { param($obj) if ($obj -is [string]) { return $obj -eq "{TBD}" } elseif ($obj -is [array]) { foreach ($item in $obj) { if (Find-Tbd $item) { return $true } } } elseif ($obj -is [PSObject]) { foreach ($prop in $obj.PSObject.Properties) { if (Find-Tbd $prop.Value) { return $true } } } return $false } if (Find-Tbd $jsonObject) { Write-Host "JSON did not validate" } else { Write-Host "JSON did validate" } } catch { Write-Host "Invalid JSON file: $_" } } # 调用示例 Test-JsonForTbd -Path "C:\secure_ConfigurationItem.json"
方法3:修正后的正则实现
如果坚持使用正则,需要转义特殊字符并正确判断匹配结果:
$json = Get-Content -Raw -Path C:\secure_ConfigurationItem.json # 转义{}元字符,同时考虑可能的空格、换行 $pattern = '"Value":\s*"\{TBD\}"' $matches = [regex]::Matches($json, $pattern) if ($matches.Count -gt 0) { Write-Host "JSON did not validate" } else { Write-Host "JSON did validate" }
内容的提问来源于stack exchange,提问作者caliGeek
相关产品推荐
相关产品推荐

