我使用PowerShell来调用GitHub接口。结果是一个JSON数组,我使用ConvertFrom-Json cmdlet将其转换为PowerShell对象。这给了我一个对象的PowerShell数组。但是,当我通过管道将其直接传递给Select-Object时,我什么也得不到:
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Select-Object -Property login, id但是,如果我将ConvertFrom-Json结果放入一个变量中,然后将该变量传递给Select-Object,它会工作:
$json = Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json
$json | Select-Object -Property login, id我被迷惑了。为什么单行版本不起作用?
发布于 2017-03-17 03:10:54
我不确定为什么one liner在当前的形式下不能工作,但这可能会修复它:
(Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3").content | ConvertFrom-Json | Select-Object -Property login, id或者,您可以这样做:
(Invoke-RestMethod -Uri "https://api.github.com/organizations?per_page=3") | Select-Object -Property login, id发布于 2017-03-17 11:38:12
这是因为powershell就是这样工作的。
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Get-Member返回一个数组,所以如果你开始对数组执行select-object,它将不会工作,因为数组没有这些属性,你可以通过管道连接到foreach来解决这个问题:
Invoke-WebRequest -Uri "https://api.github.com/organizations?per_page=3" | ConvertFrom-Json | Foreach-Object { $_ | select id,login }编辑: Invoke-RestMethod是更好的方法。edit2:命令周围的圆括号使该命令执行,并在命令完成时发送整个输出,因此管道仅在命令完成后才开始,但在第一个结果就绪时开始。
发布于 2017-11-29 11:54:34
原因似乎是Invoke-WebRequest和Invoke-RestMethod将它们的输出作为单个项目放在管道上,即使该输出是一个数组。将输出存储在变量中,然后将其输送进来,或者在子表达式中运行web请求,都会导致数组元素被放入管道中,而不是数组本身。
> 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.Objecthttps://stackoverflow.com/questions/42842781
复制相似问题