【问题标题】:Powershell How to extract hashtable value from nested hashtablePowershell如何从嵌套哈希表中提取哈希表值
【发布时间】:2020-06-01 22:15:15
【问题描述】:

我已向ManageEngine 技术支持数据库发出 API 请求,该数据库返回一个 JSON 响应,该响应作为三个哈希表的自定义对象返回:$result.response_status、$result.list_info 和 $result.requests其中第三个包含我正在寻找的数据。

$results.requests.id 一个整数

$results.requests.subject 一个字符串

$results.requester 一个哈希表。

请求者哈希表为@requester{name= 'Martin Zimmerman'; email='mzimmer@company.com'}

我想做的是:

$results.requests | select id, subject, requester.name  

获取显示 id、主题和请求者姓名的单行

id   subject         name
--   --------------  --------------
3329 Can't open file Martin Zimmerman 

但是,我无法弄清楚在请求者哈希表中提取名称键值的命名法。

【问题讨论】:

  • 如果您已经通过 ConvertFrom-Json 解析了 JSON,请注意您得到的是(可能嵌套的)[pscustomobject] 实例,而不是哈希表。 字符串化 [pscustomobject] 实例看起来有点像 哈希表文字,这可能会导致混淆 - 请参阅this answer

标签: powershell hash


【解决方案1】:

我想这就是你想要的。您需要构建一个Calculated Property(示例10)。

$results.requests | Select-Object id,subject,@{l='name';e={$_.requester['name']}}

这种方法允许您从哈希表中调用名称键。

编辑

如果您的 requester 项目是 PSCustomObject,那么试试这个。

$results.requests | Select-Object id,subject,@{l='name';e={$_.requester.name}}

使用相似的对象结构进行测试。

$results = New-Object psobject
$requests = New-Object psobject
$requests | Add-Member -MemberType NoteProperty -Name id -Value 2
$requests | Add-Member -MemberType NoteProperty -Name subject -Value "lol"
$hash = @{}
$hash.Add("email","mzimmerman@company.com")
$hash.Add("name","Martin Zimmerman")
$requests | Add-Member -MemberType NoteProperty -Name requester -Value $hash
$results | Add-Member -MemberType NoteProperty -Name requests -Value $requests
$results.requests | select id,subject,@{l='name';e={$_.requester['name']}}

id subject name
-- ------- ----
 2 lol     Martin Zimmerman

【讨论】:

  • 嗯....试过了,但它的名字一无所获。我不知道这是否有任何区别,但如果我在 $results.requester 上执行 Get-Member,它会显示:requester NoteProperty System.Management.Automation.PSCustomObject requester=@{​​email_id=tmzimm@company.com;名称=马丁齐默尔曼}
  • 如果我正确理解了您的数据结构,那么我的答案是有效的,并且添加测试只是为了证明它。如果在$results.requests 下您有一个名为requester 的属性,其中包含一个带有一个名为name 的键的哈希表,您只需要使用我发布的一行答案。如果您的数据结构不同,那么您需要通过在打印$results.requests 时显示您在控制台中看到的内容来更新您的问题。听起来您实际上还没有哈希表...
  • 改用$_.requester.Name,这是访问[pscustomobject]实例属性所必需的(该语法也适用于哈希表); @user2901305,你看到的可能看起来对你来说就像一个哈希表,但这仅仅是 [pscustomobject] 实例 stringify 的方式。
  • Ash... 非常感谢您的回复,确实,在我重新开始之后,第一个单行代码可以正确处理计算的属性。 $results.requests | Select-Object id,subject,@{l='name';e={$_.requester.name}} 我认为我的问题可能是:我最终将 API 调用的输出存储为字符串,或者,我引用了一个不同的变量。简而言之……这对我来说是一个非常愚蠢的错误。有趣的是计算属性的整个概念......我以前没有遇到过。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多