如何访问 Powershell PSCustomObject 属性?
How can I access Powershell PSCustomObject properties?
我正在通过 Powershell 脚本处理一些 API 结果处理。
API 数据 (json) 来自:
$tree = Invoke-WebRequest -Uri "xxxxxxxxmonURLxxxxxxxxxx/130333"
$children = ($tree.Content | ConvertFrom-Json).data.12345.children
然后我使用 | ForEach
遍历 $children 对象
$_
循环内的“147852”为 $_.Name
,以下对象为 $_.Definition
我想解析 $_.Definition
中的对象,但不知道如何访问它。
Definition 对象如下所示:
TypeName : System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
147852 NoteProperty System.Management.Automation.PSCustomObject 147852=@{nodeType=node; name=test1; flag=N0; creationDate=2022-02-17T14:50:16+00:00; hasAlerts=False; children=}
并且我希望访问 147852
键中的任何 属性(例如 nodeType、name、flag、...、children)。
$_.147852 输出一个错误说 147852
没有找到。
谢谢。
API json 返回:
{
"data": {
"130333": {
"nodeType": "node",
"name": "Test name",
"flag": "N0",
"children": {
"147852": {
"nodeType": "node",
"name": "test1",
"flag": "N0",
"hasAlerts": false,
"children": {
"147853": {
"nodeType": "node",
"name": "test2",
"flag": "N0",
"children": {
"NP12-N9-S4": {
"nodeType": "agent",
"name": "Win10",
"type": "S"
}
}
}
}
}
}
}
}
Jeroen Mostert provided the crucial pointer in the comments, and Bender the Greatest links to what is effectively a ,但考虑到后者是 hashtable-focused,让我在 custom objects[=35] 的上下文中概括一下这个问题=] ([pscustomobject]
):
不考虑意外使用 Get-Member
,您的问题最终归结为 PowerShell 中的 解析器错误 ](参见 GitHub issue #14036):
为了避免这种情况,引用 属性 看起来像数字的名字 - 例如,要访问对象 $obj
上的 属性 147852
,请使用 $obj.'147852'
严格来说,只有当您尝试 附加(嵌套)属性 访问时才会出现该错误:
# Nested sample custom object.
$obj = [pscustomobject] @{ 147852 = [pscustomobject] @{ name = 'test1' } }
# OK - number-like property is accessed without quoting, but *not nested*.
# However, $obj.'147852' is preferable.
$obj.147852
# *Nested* property access:
# !! BUG triggers error: "Missing property name after reference operator."
$obj.147852.name
# OK: Quoting avoids the problem.
$obj.'147852'.name # -> 'test1'
我正在通过 Powershell 脚本处理一些 API 结果处理。 API 数据 (json) 来自:
$tree = Invoke-WebRequest -Uri "xxxxxxxxmonURLxxxxxxxxxx/130333"
$children = ($tree.Content | ConvertFrom-Json).data.12345.children
然后我使用 | ForEach
遍历 $children 对象
$_
循环内的“147852”为 $_.Name
,以下对象为 $_.Definition
我想解析 $_.Definition
中的对象,但不知道如何访问它。
Definition 对象如下所示:
TypeName : System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
147852 NoteProperty System.Management.Automation.PSCustomObject 147852=@{nodeType=node; name=test1; flag=N0; creationDate=2022-02-17T14:50:16+00:00; hasAlerts=False; children=}
并且我希望访问 147852
键中的任何 属性(例如 nodeType、name、flag、...、children)。
$_.147852 输出一个错误说 147852
没有找到。
谢谢。
API json 返回:
{
"data": {
"130333": {
"nodeType": "node",
"name": "Test name",
"flag": "N0",
"children": {
"147852": {
"nodeType": "node",
"name": "test1",
"flag": "N0",
"hasAlerts": false,
"children": {
"147853": {
"nodeType": "node",
"name": "test2",
"flag": "N0",
"children": {
"NP12-N9-S4": {
"nodeType": "agent",
"name": "Win10",
"type": "S"
}
}
}
}
}
}
}
}
Jeroen Mostert provided the crucial pointer in the comments, and Bender the Greatest links to what is effectively a [pscustomobject]
):
不考虑意外使用 Get-Member
,您的问题最终归结为 PowerShell 中的 解析器错误 ](参见 GitHub issue #14036):
为了避免这种情况,引用 属性 看起来像数字的名字 - 例如,要访问对象 $obj
上的 属性 147852
,请使用 $obj.'147852'
严格来说,只有当您尝试 附加(嵌套)属性 访问时才会出现该错误:
# Nested sample custom object.
$obj = [pscustomobject] @{ 147852 = [pscustomobject] @{ name = 'test1' } }
# OK - number-like property is accessed without quoting, but *not nested*.
# However, $obj.'147852' is preferable.
$obj.147852
# *Nested* property access:
# !! BUG triggers error: "Missing property name after reference operator."
$obj.147852.name
# OK: Quoting avoids the problem.
$obj.'147852'.name # -> 'test1'