Powershell 替换/重命名对象属性名称
如果dns解析成功,我需要将“ip网络掩码”替换为“fqdn” 此脚本将用于替换配置文件中的值 如果解析了DNS,我需要将“ip网络掩码”的属性名称更改为“fqdn”,并将新的DNS值存储在它下面。脚本解析DNS并仅在成功时更新ip网络掩码,如果成功,还将使用DNS值添加fqdn属性 似乎我在那里,但我无法将ip网络掩码重命名为fqdn,或者在不使fqdn属性为空的情况下删除ip网络掩码属性 从原始json输入Powershell 替换/重命名对象属性名称,powershell,object,rename,Powershell,Object,Rename,如果dns解析成功,我需要将“ip网络掩码”替换为“fqdn” 此脚本将用于替换配置文件中的值 如果解析了DNS,我需要将“ip网络掩码”的属性名称更改为“fqdn”,并将新的DNS值存储在它下面。脚本解析DNS并仅在成功时更新ip网络掩码,如果成功,还将使用DNS值添加fqdn属性 似乎我在那里,但我无法将ip网络掩码重命名为fqdn,或者在不使fqdn属性为空的情况下删除ip网络掩码属性 从原始json输入 @' { "entry":[ {
@'
{
"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"
}
]
}
输出
{
"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"
}
]
}
您不应该尝试重命名现有属性,而是将其删除并将新的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
希望有帮助
根据您的评论,属性的显示顺序对您很重要 要维持秩序,请使用
$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
您不应该尝试重命名现有属性,而是将其删除并将新的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
希望有帮助
根据您的评论,属性的显示顺序对您很重要 要维持秩序,请使用
$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
第一个几乎正是我想要的。我尝试了计算属性和其他一些东西,但从未遇到noteproperty。最后一件事…您知道如何将fqdn放置在JSON结构中ip网络掩码字段的位置吗?这是一个配置文件,我把它放回去,所以需要维护顺序。此处的输出将fqdn放在descriptionI之后。我尝试过选择对象,并在covert to json管道中按顺序列出属性,但不是这样working@dcvl我用代码编辑了我的答案,以维护财产秩序。非常好。谢谢我无法让计算出的属性自己工作,因为第一个几乎正是我想要的。我尝试了计算属性和其他一些东西,但从未遇到noteproperty。最后一件事…您知道如何将fqdn放置在JSON结构中ip网络掩码字段的位置吗?这是一个配置文件,我把它放回去,所以需要维护顺序。此处的输出将fqdn放在descriptionI之后。我尝试过选择对象,并在covert to json管道中按顺序列出属性,但不是这样working@dcvl我用代码编辑了我的答案,以维护财产秩序。非常好。谢谢我无法让计算出的属性自己工作