首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换/重命名对象属性名称

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

Stack Overflow用户
提问于 2019-12-30 22:07:30
回答 3查看 8K关注 0票数 3

如果dns解析成功,我需要用“fqdn”替换“ip网络掩码”。

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

如果DNS被解析,我需要将“ip-net掩码”的属性名更改为“fqdn”,并将新的dns值存储在它下面。脚本解析DNS,只有在成功的情况下才更新IPnet掩码,如果成功,还将添加带有DNS值的fqdn属性。

似乎我就在那里,但我不能将ip- not掩码重命名为fqdn,也不能只删除ip-not掩码属性而不使我的fqdn属性为空。

从原始json输入

代码语言:javascript
复制
@'
{
    "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"
        }
    ]
}
代码语言:javascript
复制
$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

输出

代码语言:javascript
复制
{

    "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"

                  }

]

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-31 13:25:12

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

代码语言:javascript
复制
$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的错误方法。这不是应该是:

代码语言:javascript
复制
$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

希望这有帮助

根据您的注释,显示属性的顺序对您很重要。

要维持秩序,请使用

代码语言:javascript
复制
$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
票数 4
EN

Stack Overflow用户

发布于 2021-12-13 01:13:52

实际上,有一种很简单的方法可以做到这一点,而不需要删除任何东西。我花了很多时间来解决我自己的问题,所以请原谅我没有将名称转换到您的上下文中,但希望这会有所帮助。这是我第一次向社区发帖,所以请放心吧!

我的PSCustomObject的起始属性(同样适用于任何对象)。目标是重命名属性名,在我的例子中保留一定的顺序。

代码语言:javascript
复制
$roleMappingsCSV | Get-Member -MemberType Properties | Select-Object Name, MemberType
Name             MemberType
----             ----------
Identifiers    NoteProperty
IdentifierType NoteProperty
InlinePolicy   NoteProperty
ManagedPolicy  NoteProperty
Members        NoteProperty
Role           NoteProperty 

溶液

代码语言:javascript
复制
$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只是存储在一个新对象中,其中包含自定义重命名的属性字段。

代码语言:javascript
复制
$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
票数 1
EN

Stack Overflow用户

发布于 2022-03-17 16:50:54

我在用:

代码语言:javascript
复制
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 )
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59537372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档