使用带有ConvertFrom-Json的Select-Object会返回奇怪的结果

时间:2015-11-25 01:05:56

标签: json windows powershell serialization wmi

我正在编写需要解除序列化JSON以与GitHub API进行通信的PowerShell代码。以下是我的代码片段:

# Grab the latest release from GitHub
$response = Invoke-WebRequest 'https://api.github.com/repos/jamesqo/Emptify/releases'
$releases = $response.Content | ConvertFrom-Json
$latest = $releases[0]
$urls = $latest.assets | Select { $_.browser_download_url }

虽然我能够在运行代码段后成功从JSON中提取我需要的值,但它们存储在' $_.browser_download_url '的一些奇怪的属性名称下,这似乎是里面的代码我的Select块。例如,这里是$urls | Get-Member

的输出
TypeName: Selected.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()
 $_.browser_download_url  NoteProperty System.String  $_.browser_download_url =https://github.com/jamesqo/Emptify/re... # ???

这是我从运行$urls | ConvertTo-Json获得的输出:

[
    {
        " $_.browser_download_url ":  "https://github.com/jamesqo/Emptify/releases/download/1.0/Emptify.Win32.zip"
    },
    {
        " $_.browser_download_url ":  "https://github.com/jamesqo/Emptify/releases/download/1.0/Emptify.x64.zip"
    }
]

为什么会发生这种情况,我该怎样做才能绕过它呢?可能是Select导致此问题的错误吗?

1 个答案:

答案 0 :(得分:1)

这可能只是意外混合语法的一种情况。在最简单的形式中,您将使用Select-Object来获取对象或对象集的指定属性。

因此,如果您希望$urls成为具有browser_download_url属性的对象数组,那么您只需要执行以下操作:

$urls = $latest.assets | Select-Object browser_download_url

您可以提取的基本属性是Get-Member的结果,但是您应该在之前检查,在这种情况下使用了select。输出被截断为仅显示几个属性。

$latest.assets | gm

   TypeName: System.Management.Automation.PSCustomObject

Name                 MemberType   Definition                                                                                                                                                 
----                 ----------   ----------                                                                                                                                                 
Equals               Method       bool Equals(System.Object obj)                                                                                                                                                                                                                                                                  
browser_download_url NoteProperty System.String browser_download_url=https://github.com/jamesqo/Emptify/releases/download/1.0/Em                                                                                                   
created_at           NoteProperty System.String created_at=2015-11-24T21:43:02Z                                                                                                              
download_count       NoteProperty System.Int32 download_count=0                                                                                                                              
url                  NoteProperty System.String url=https://api.github.com/repos/jamesqo/Emptify/releases/assets/1068007  

有理由将代码相似。自定义排序属性和计算属性。但这里都不需要这些。