替换/重命名对象属性名称

时间:2019-12-30 22:07:30

标签: powershell object rename

如果dns解析成功,我需要用“ fqdn”替换“ ip-netmask”。

此脚本将用于替换配置文件中的值。

如果DNS已解析,则需要将“ ip-netmask”的属性名称更改为“ fqdn”,并在其下存储新的dns值。该脚本解析DNS,如果成功,则仅更新ip-netmask,如果成功,还将添加带有DNS值的fqdn属性。

好像我在那儿一样,但是我无法将ip-netmask重命名为fqdn,或者仅删除ip-netmask属性而不将我的fqdn属性设置为空

来自原始json输入


@'
{
    "entry":[
        {
            "@name":"31.170.162.203",
            "ip-netmask":"31.170.162.203",
            "description":"test1"
        },
        {
            "@name":"37.193.217.222",
            "ip-netmask":"37.193.217.222",
            "description":"test2"
        },
        {
            "@name":"46.17.63.169",
            "ip-netmask":"46.17.63.169",
            "description":"test3"
        }
    ]
}

$a = Get-Content 'C:\Users\e\Desktop\puttytest1.json' | ConvertFrom-Json



$a.entry | ForEach-Object {

    if ($namehost = (Resolve-DnsName $_.'ip-netmask').namehost) {

        $_.'ip-netmask' = $namehost

        $_ | Add-Member -MemberType AliasProperty -Name fqdn -Value ip-netmask

        }
    }

$newjson = $a | ConvertTo-Json

$newjson

输出


{

    "entry":  [

                  {

                      "@name":  "31.170.165.68",

                      "ip-netmask":  "31.170.165.68",

                      "description":  "Test1"

                  },

                  {

                      "@name":  "31.170.162.203",

                      "ip-netmask":  "31.170.162.203",

                      "description":  "test2"

                  },

                  {

                      "@name":  "37.193.217.222",

                      "ip-netmask":  "l37-193-217-222.novotelecom.ru",

                      "description":  "test3",

                      "fqdn":  "l37-193-217-222.novotelecom.ru"

                  }

]

}

1 个答案:

答案 0 :(得分:1)

您不应尝试重命名现有属性,而应将其删除并将新的NoteProperty添加到对象,如下所示:

$newjson = $a.entry | ForEach-Object {
    if ($namehost = (Resolve-DnsName $_.'ip-netmask').namehost) {
        # remove the 'ip-netmask' property
        $_.PSObject.Properties.Remove('ip-netmask')
        # add a new NoteProperty 'fqdn'
        $_ | Add-Member -MemberType NoteProperty -Name 'fqdn' -Value $namehost
    }
} | ConvertTo-Json

但是,我认为您使用错误的方法从IP地址检索fqdn。 尝试以下方法:

$newjson = $a.entry | ForEach-Object {
    if ($namehost = [System.Net.Dns]::GetHostByAddress($($_.'ip-netmask')).HostName) {
        # remove the 'ip-netmask' property
        $_.PSObject.Properties.Remove('ip-netmask')
        # add a new NoteProperty 'fqdn'
        $_ | Add-Member -MemberType NoteProperty -Name 'fqdn' -Value $namehost
    }
} | ConvertTo-Json

希望有帮助