如果dns解析成功,我需要用“fqdn”替换“ip网络掩码”。
此脚本将用于替换配置文件中的值。
如果DNS被解析,我需要将“ip-net掩码”的属性名更改为“fqdn”,并将新的dns值存储在它下面。脚本解析DNS,只有在成功的情况下才更新IPnet掩码,如果成功,还将添加带有DNS值的fqdn属性。
似乎我就在那里,但我不能将ip- not掩码重命名为fqdn,也不能只删除ip-not掩码属性而不使我的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"
}
]
}发布于 2019-12-31 13:25:12
您不应该尝试重命名一个现有的属性,而是删除它并将新的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发布于 2021-12-13 01:13:52
实际上,有一种很简单的方法可以做到这一点,而不需要删除任何东西。我花了很多时间来解决我自己的问题,所以请原谅我没有将名称转换到您的上下文中,但希望这会有所帮助。这是我第一次向社区发帖,所以请放心吧!
我的PSCustomObject的起始属性(同样适用于任何对象)。目标是重命名属性名,在我的例子中保留一定的顺序。
$roleMappingsCSV | Get-Member -MemberType Properties | Select-Object Name, MemberType
Name MemberType
---- ----------
Identifiers NoteProperty
IdentifierType NoteProperty
InlinePolicy NoteProperty
ManagedPolicy NoteProperty
Members NoteProperty
Role NoteProperty 溶液
$roleMappingsCSV_Proper = $roleMappingsCSV | Select-Object @{N='IAM_Role'; E={$_.Role}},`
@{N='Basis_Type'; E={$_.IdentifierType}},`
@{N='Basis_for_Access'; E={$_.Identifiers}},`
@{N='Members'; E={$_.Members}},`
@{N='Managed_Policy'; E={$_.ManagedPolicy}},`
@{N='InlinePolicy'; E={$_.InlinePolicy}}现在您可以看到,PSCustomObject只是存储在一个新对象中,其中包含自定义重命名的属性字段。
$roleMappingsCSV_Proper | Get-Member -MemberType Properties | Select-Object Name, MemberType
Name MemberType
---- ----------
Basis_for_Access NoteProperty
Basis_Type NoteProperty
IAM_Role NoteProperty
InlinePolicy NoteProperty
Managed_Policy NoteProperty
Members NoteProperty发布于 2022-03-17 16:50:54
我在用:
function Rename-Properties(){
[CmdletBinding()]
Param([Parameter(ValueFromPipeline=$true,Mandatory=$true,Position=0)][Object]$inputObject
, [Parameter(ValueFromPipeline=$false,Mandatory=$false)][Object]$NewNames
, [Parameter(ValueFromPipeline=$false,Mandatory=$false)][switch]$Keep=$false
)
# Parameter NewNames: can take (a mapping) HashTable{Key(NewName)=Value(Name)]
# or object collection with properties Name,NewName
# e.g. $myInputObject.PSObject.properties | Where-Object {$_.Name -like '*'} | Select-Object Name,@{N='NewName';E={"Prefixed_$($_.Name"}}
if($NewNames -is [HashTable]) { $NewNames = $NewNames.GetEnumerator() | Select-Object @{N='Name';E={$_.Value}},@{N='NewName';E={$_.Key}} }
# ensure NewName exists and is unique
$NewNames = ( $NewNames | Where-Object {$_.NewName.length -gt 0} | Group-Object -Property NewName | ForEach-Object{$_.Group[0]} )
$props = @('*')
ForEach($prp in $NewNames) {
$props += @{N="$($prp.NewName)";E=([Scriptblock]::Create("`$_.$($prp.Name)"))}
}
if($Keep) {
return ($inputObject | Select-Object -Property $props )
} else {
return ($inputObject | Select-Object -Property $props -ExcludeProperty $NewNames.Name )
}
}https://stackoverflow.com/questions/59537372
复制相似问题