本文介绍了循环访问PSCustomObject中的键名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的站点编写一个使用JSON配置文件的脚本。JSON如下所示:

"Groups": {
    "GroupOne": {
        "NamingFilter": {
            "Not":"<SITE>-MJ*",
            "Has":"*WM,*WT"
        }
    },
    "GroupTwo": {
        "NamingFilter": {
            "Has":"<SITE>-MJ*, *WC,*WL"
        }
    },
    "GroupThree": {
        "NamingFilter": {
            "Not":"<SITE>-MJ*",
            "Has":"*WI"
        }
    }
}

为了将对象转换为PowerShell可以读取的内容,我使用ConvertFrom-Json将其转换为类型PSCustomObject

我必须迭代Groups并获取每个组名以输出它们及其在配置的Groups对象中的相应索引。也就是说,

1. GroupOne
2. GroupTwo
3. GroupThree

我得到的最多是:

foreach ($group in $configObject.Groups) {
    $group
}

所有这些操作都是输出类似PowerShell数组表示法的内容:

@{GroupOne=; GroupTwo=; GroupThree=;}

对于PSCustomObject类型,这可能吗?我主要用JavaScript编写代码,所以我可能过于简化(或过度复杂化)了问题,因为这相对容易。

推荐答案

多亏了博客帖子Converting PsCustomObject To/From Hashtables,我想我可能已经弄明白了。

使用Get-Member,然后使用-MemberType显示每个组,然后只需拉出:

foreach ($group in $configObject.Groups) {
    $groupName = $($group | Get-Member -MemberType *Property).Name
}

输出:

GroupOne
GroupTwo
GroupThree

我对任何其他方法都持开放态度。

更新

我找到了另一种方法,但唯一的缺点是它没有使用花哨的ConvertFrom-JsonCmdlet。相反,它直接转到.NET库,使用其反序列化程序并将其转换为HashTable。这完全避免了使用PSCustomObject的麻烦。使用IMO哈希表要容易得多。

$JSON = Get-Content -Path path/to.json -Raw
$HT = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON, [System.Collections.Hashtable])
$HT.Groups.GetEnumerator() | ForEach-Object {
    Write-Host "$($_.Key) : $($_.Value)"
}

这篇关于循环访问PSCustomObject中的键名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-21 12:21