首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell调用Github API: ConvertFrom-Json管道之谜

Powershell调用Github API: ConvertFrom-Json管道之谜
EN

Stack Overflow用户
提问于 2017-03-17 03:04:23
回答 3查看 673关注 0票数 2

我使用PowerShell来调用GitHub接口。结果是一个JSON数组,我使用ConvertFrom-Json cmdlet将其转换为PowerShell对象。这给了我一个对象的PowerShell数组。但是,当我通过管道将其直接传递给Select-Object时,我什么也得不到:

代码语言:javascript
复制
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Select-Object -Property login, id

但是,如果我将ConvertFrom-Json结果放入一个变量中,然后将该变量传递给Select-Object,它会工作:

代码语言:javascript
复制
$json = Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json 
$json | Select-Object -Property login, id

我被迷惑了。为什么单行版本不起作用?

EN

回答 3

Stack Overflow用户

发布于 2017-03-17 03:10:54

我不确定为什么one liner在当前的形式下不能工作,但这可能会修复它:

代码语言:javascript
复制
(Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3").content | ConvertFrom-Json | Select-Object -Property login, id

或者,您可以这样做:

代码语言:javascript
复制
(Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3") | Select-Object -Property login, id
票数 1
EN

Stack Overflow用户

发布于 2017-03-17 11:38:12

这是因为powershell就是这样工作的。

代码语言:javascript
复制
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Get-Member

返回一个数组,所以如果你开始对数组执行select-object,它将不会工作,因为数组没有这些属性,你可以通过管道连接到foreach来解决这个问题:

代码语言:javascript
复制
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Foreach-Object {  $_ | select id,login }

编辑: Invoke-RestMethod是更好的方法。edit2:命令周围的圆括号使该命令执行,并在命令完成时发送整个输出,因此管道仅在命令完成后才开始,但在第一个结果就绪时开始。

票数 1
EN

Stack Overflow用户

发布于 2017-11-29 11:54:34

原因似乎是Invoke-WebRequestInvoke-RestMethod将它们的输出作为单个项目放在管道上,即使该输出是一个数组。将输出存储在变量中,然后将其输送进来,或者在子表达式中运行web请求,都会导致数组元素被放入管道中,而不是数组本身。

代码语言:javascript
复制
> Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3" | % { $_.GetType() }

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


> (Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3") | % { $_.GetType() }

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object
True     False    PSCustomObject                           System.Object
True     False    PSCustomObject                           System.Object
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42842781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档