将嵌套属性添加到PowerShell对象

时间:2018-01-10 21:07:00

标签: json powershell

我正在使用PowerShell中的脚本来更新JSON数据,访问3层深度的修改数据。一般流程是:

$obj = Get-Content -Raw -Path $pathstring | ConvertFrom-Json
$obj.prop1.prop2.prop3.prop4 = "test"
$outjson = ConvertTo-Json -InputObject $obj -Depth 5
Set-Content -Path $pathstring -Value $outjson

当属性已存在时,此方法有效。但是,在某些情况下$obj.prop1.prop2.prop3.prop4不存在。我想向PowerShell对象添加一系列嵌套属性,然后将其转换为JSON以创建它。

这可能/如何完成/是否有更好的方法将JSON值添加到PowerShell中的某些内容?

编辑:我正在运行

if(Get-Member -inputobject $js.prop1 -name "prop2" -Membertype Properties)

测试属性是否存在,如果prop2不存在,那么我需要创建所有属性。

2 个答案:

答案 0 :(得分:1)

如果某个属性不存在,则需要添加该属性,否则无法为其指定值:

$obj.prop1.prop2.prop3 | Add-Member -Type NoteProperty -Name 'prop4' -Value 'test'

答案 1 :(得分:0)

我最近遇到了一个类似的问题,我需要向对象添加嵌套属性,因此我为此编写了一个递归函数。

- name: Show Databases
  uri:
    url: "http://localhost:8086/query"
    user: admin
    password: password
    method: POST
    body: 
      q: SHOW DATABASES
    body_format: form-urlencoded

用法示例:

function Add-NoteProperty {
    param(
        $InputObject,
        $Property,
        $Value,
        [switch]$Force
    )
    process {
        [array]$path = $Property -split "\."
        If ($Path.Count -gt 1) {
            #go in to recursive mode
            $Obj = New-Object PSCustomObject
            Add-NoteProperty -InputObject $Obj -Property ($path[1..($path.count - 1)] -join ".") -Value $Value
        }
        else {
            #last node
            $Obj = $Value
        }
        $InputObject | Add-Member NoteProperty -Name $path[0] -Value $Obj -Force:$Force
    }
}