You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码问题分析与修正

你的代码存在几个关键问题:

  1. 正则捕获组使用错误:Where-Object {$_.Name -EQ 'TBD'} 中的$_.Name指的是正则捕获组的名称(比如第1个捕获组名称为1),并非匹配到的内容,无法筛选出包含{TBD}的结果。
  2. 正则未转义特殊字符:{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:25:31