PowerShell向现有JSON添加属性执行报错问题咨询
问题根因定位
- 版本兼容问题:
ConvertFrom-Json的-Depth参数仅在PowerShell 7.0及以上版本提供,你当前使用的是Windows自带的PowerShell 5.1版本,不存在该参数,触发第一个参数绑定报错。实际上ConvertFrom-Json会自动完整解析JSON的所有层级,不需要手动指定深度,只有反向转换的ConvertTo-Json需要指定深度防止对象层级截断。 - 连锁报错:前一步JSON转换执行失败后,
$newProperty变量为空,后续提取属性名得到null值,传给Add-Member的-Name参数时触发空参数校验报错。 - 逻辑冗余:你不需要重写整个
OverrideValues节点做全量覆盖,直接定位到目标节点追加新属性即可,不会破坏原有已存在的配置项。
正确实现代码
直接运行以下代码即可实现需求,原有HostName配置会完整保留,新属性会追加到指定节点下:
# 读取源JSON文件,-Raw参数将内容读取为完整单字符串,避免转换异常 $json = Get-Content .\source.json -Raw # 转换为PowerShell可操作的对象 $psObject = $json | ConvertFrom-Json # 定位到需要修改的XXXX3Service下的OverrideValues节点 $targetOverrideNode = $psObject.Services.XXXX3Service.OverrideValues # 逐个追加需要新增的属性 $targetOverrideNode | Add-Member -MemberType NoteProperty -Name "XXX 3 Service" -Value @{Enabled = $true} -Force $targetOverrideNode | Add-Member -MemberType NoteProperty -Name "My Token" -Value @{Value = "1234567890"} -Force $targetOverrideNode | Add-Member -MemberType NoteProperty -Name "Authority" -Value @{Value = "authority.com"} -Force $targetOverrideNode | Add-Member -MemberType NoteProperty -Name "ThisSecret" -Value @{Value = "1234-1234-1234-1234"} -Force # 转换回JSON,指定足够深度避免层级截断,指定UTF8编码防止乱码 $psObject | ConvertTo-Json -Depth 100 | Out-File "C:\temp\good.json" -Encoding utf8
注意:运行前请确认
C:\temp目录存在,否则会触发目录不存在的报错。
内容的提问来源于stack exchange,提问作者HunkyDory
相关产品推荐
相关产品推荐

