本文介绍了循环访问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-Json
Cmdlet。相反,它直接转到.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中的键名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!