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

dcv*_*cvl 3 powershell rename object

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

\n

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

\n

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

\n

好像 I\xe2\x80\x99m 在那里,但我无法将 ip-netmask 重命名为 fqdn,或者只是删除 ip-netmask 属性而不使我的 fqdn 属性为 null

\n

来自原始 json 输入

\n
@\'{\n    "entry":[\n        {\n            "@name":"31.170.162.203",\n            "ip-netmask":"31.170.162.203",\n            "description":"test1"\n        },\n        {\n            "@name":"37.193.217.222",\n            "ip-netmask":"37.193.217.222",\n            "description":"test2"\n        },\n        {\n            "@name":"46.17.63.169",\n            "ip-netmask":"46.17.63.169",\n            "description":"test3"\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的脚本

\n
$a = Get-Content \'C:\\Users\\e\\Desktop\\puttytest1.json\' | ConvertFrom-Json\n \n$a.entry | ForEach-Object {\n    if ($namehost = (Resolve-DnsName $_.\'ip-netmask\').namehost) {\n        $_.\'ip-netmask\' = $namehost\n        $_ | Add-Member -MemberType AliasProperty -Name fqdn -Value ip-netmask\n        }\n    }\n\n$newjson = $a | ConvertTo-Json\n$newjson\n
Run Code Online (Sandbox Code Playgroud)\n

这是输出:

\n
{\n    "entry":  [\n        {\n            "@name":  "31.170.165.68",\n            "ip-netmask":  "31.170.165.68",\n            "description":  "Test1"\n        },\n        {\n            "@name":  "31.170.162.203",\n            "ip-netmask":  "31.170.162.203",\n            "description":  "test2"\n        },\n        {\n            "@name":  "37.193.217.222",\n            "ip-netmask":  "l37-193-217-222.novotelecom.ru",\n            "description":  "test3",\n            "fqdn":  "l37-193-217-222.novotelecom.ru"\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

The*_*heo 5

您不应尝试重命名现有属性,而应将其删除并将新的 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
Run Code Online (Sandbox Code Playgroud)

但是,我相信您使用了错误的方法从 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
Run Code Online (Sandbox Code Playgroud)

希望有帮助


根据您的评论,属性的显示顺序对您来说很重要。

要维持该顺序,请使用

$newjson = $a.entry | ForEach-Object {
    if ($namehost = (Resolve-DnsName $_.'ip-netmask').namehost) {
        # output a new object with properties ordered like you want them to be
        $_ | Select-Object '@name', @{Name = 'fqdn'; Expression = {$namehost}}, 'description'
    }
    else { 
        # output the object unchanged
        $_ 
    }
} | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)