使用 Select-Object with ConvertFrom-Json returns 奇怪的结果

Using Select-Object with ConvertFrom-Json returns weird results

我正在编写需要 de/serialize 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 中成功提取我需要的值,但它们存储在 [=16] 的一些奇怪的 属性 名称下=],这似乎是我的 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 中的错误导致的?

这可能只是偶然混合语法的情况。在最简单的形式中,您将使用 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)                                                                                                                                                                                                                                                                  
<b>browser_download_url</b> 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  

有理由让代码与上面的代码相似。自定义排序属性和计算属性。不过这里不需要这些。