PowerShell如何验证字符串参数是否为JSON的有效顶层键
问题定位
你的判断逻辑确实存在错误:你当前的判断条件$param -eq $json是将传入的参数字符串和JSON反序列化得到的完整PS对象直接做相等比较,二者类型、内容完全不匹配,所以判断永远返回false,始终输出无效提示。
另外你当前脚本还有一个语法问题:PowerShell要求param()参数声明块必须放在脚本的最开头(注释除外),你将JSON读取逻辑放在param前会导致传参不生效。
修复后完整脚本
# 参数块必须放在脚本最开头 param( [string]$param = "Customer" ) # 读取并解析JSON $json = Get-Content .\basket.json -Raw | ConvertFrom-Json # 获取所有顶层键集合 $topLevelKeys = $json.PSObject.Properties.Name if ($param -in $topLevelKeys) { Write-Host "Valid Customer Key" # 后续生成输出文件的逻辑 $output = ($json.$param.PSObject.Properties.Name | ForEach-Object { "$_={0}" -f $json.$param.$_ }) -join "`n" $Path2 = ".\output\env" # 先确保output目录存在,避免写入报错 if (-not (Test-Path .\output)) { New-Item -ItemType Directory -Path .\output | Out-Null } $output | Out-File $Path2 -Encoding utf8 } else { $message = "Invalid Customer Key" Write-Host $message }
改动说明
- 调整了param参数块的位置,符合PowerShell语法规范
- 新增了顶层键集合的获取逻辑,判断传入参数是否在键集合中
- 补充了output目录存在性校验,避免写入文件时报目录不存在的错误
- 如果你需要支持传入多个参数校验,只需要把参数类型改回
[string[]]$param,再调整判断逻辑为遍历所有传入参数逐一校验即可
内容的提问来源于stack exchange,提问作者ashblossom
相关产品推荐
相关产品推荐

