json 从Az Devops结果中检索PowerShell中的信息

gkl3eglg  于 2023-07-01  发布在  Shell
关注(0)|答案(3)|浏览(130)

我正在通过Azure CLI(az devops security group membership list --id "xxx")从Azure Devops中检索组信息。不幸的是,结果在PowerShell中无法使用。
这是json的结果,我需要mailAddress。

{
  "DESCRIPTOR": {
    "descriptor": "DESCRIPTOR",
    "directoryAlias": "DIRECTORYALIAS",
    "displayName": "DISPLAYNAME",
    "domain": "DOMAIN",
    "legacyDescriptor": LEGACYDESCRIPTOR,
    "mailAddress": "MAILADDRESS",
    "metaType": "METATYPE",
    "origin": "ORIGIN",
    "originId": "ORIGINID",
    "principalName": "PRINCIPALNAME",
    "subjectKind": "SUBJECTKIND",
    "url": "URL"
  },
.....
}

是否有人处理了结果并知道如何获得mailAddress?
谢谢!

34gzjxbg

34gzjxbg1#

**简答:**你应该可以通过$result.'DESCRIPTOR'.mailAddress到达mailAddress属性。

以下是为什么和如何:

PS C:\> $result = az devops security group membership list --id "xxx" --organization "yyy" | ConvertFrom-Json
PS C:\> $result.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object

PS C:\Users\BHANNADE> $result | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name                                                 MemberType   Definition
----                                                 ----------   ----------
Equals                                               Method       bool Equals(System.Object obj)
GetHashCode                                          Method       int GetHashCode()
GetType                                              Method       type GetType()
ToString                                             Method       string ToString()
aad.NmEzOTc1MTIt...xYr58NWZkLTg4MDQtY2QxZGUxODkzMWQ4 NoteProperty System.Management.Automation.PSCustomObject ...
aad.Y2I1NjM2NjIt...mZi03NzA5LTg4MWQtNDZjZmI5NjRjYWMy NoteProperty System.Management.Automation.PSCustomObject ...

这告诉我们,$result是一个PowerShell自定义对象,描述符本身作为成员(NoteProperties)。
因此,$result.'DESCRIPTOR'.mailAddress应该可以让您访问mailAddress属性:

PS C:\> $result.'aad.NmEzOTc1MTIt...xYr58NWZkLTg4MDQtY2QxZGUxODkzMWQ4'.mailAddress
abc.xyz@email.com

更新:

一个Team中可能有多个成员,因此您的$result可能包含多个对象。您可以提取所有电子邮件地址,如下所示:

$properties = $result | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name
$mailAddresses = @()
$mailAddresses += $properties.ForEach({$result.$_.mailAddress})
yiytaume

yiytaume2#

你可以直接使用Azure CLI和全局参数--query,你可以像这样获取mailAddress:

az devops security group membership list --id "xxx" --query "DESCRIPTOR.mailAddress"

此外,您可以使用--output更改输出格式。

pdsfdshx

pdsfdshx3#

默认情况下,此命令返回JSON。
您可以通过ConvertFrom-Json将JSON转换为PSCustomObject
下一个问题是,这个命令没有像您期望的那样返回一个集合,而是返回一个带有属性的对象(每个属性名都是描述符值,正如您所看到的)。
正如其他人所建议的那样,您可以通过Get-Member -PropertyType NoteProperty获取这些属性名称。也可以通过对象的PSObject属性访问这些属性。后者的优点是,您可以访问属性的value属性-这就是您想要的

# fetch the direct members of our group (NOTE: this is not recursive :/)
$secGroupInfo = az devops security group membership list --org $orgUri --id $someId | 
    ConvertFrom-Json

# list all mails in this group
$secGroupInfo.PSObject.Properties.where{$_.MemberType -eq 'NoteProperty'}.Value.mailAddress

# or display mails & related info in a table
$secGroupInfo.PSObject.Properties.where{$_.MemberType -eq 'NoteProperty'}.Value | 
    ft displayName, principalName, originId, mailAddress -AutoSize

相关问题