我有一个REST API,它将返回行。但是,
为什么Invoke-RestMethod -Uri "..." -Method Get | select XXX,YYY
仅返回标头?
XXX YYY
--- ---
但是(Invoke-RestMethod -Uri "..." -Method Get) | select X,Y
返回行吗?
首先分配变量也可以。
$x = Invoke-RestMethod -Uri "..." -Method Get | select XXX,YYY
$x | select xxx,yyyy
答案 0 :(得分:1)
一般来说:
如果命令将集合作为单个对象输出,则Select-Object X, Y
将无法按预期运行,因为它将在 collection 对象(找不到它们),在这种情况下,Select-Object
创建一个具有所请求属性的 single 对象,然后所有这些对象都包含{{ 1}}。
$null
可能是此行为的候选者,因为它可能通过 Invoke-RestMethod
隐式地将返回值解析为JSON,而实际上输出数组作为单个对象 ; this GitHub issue中讨论了这种令人惊讶的行为。 在命令中放置ConvertFrom-Json
强制枚举 ,这样可以解决问题:
(...)
另一种选择是分配一个(中间的)变量 ,如您的问题所示-尽管# Place (...) around the Invoke-RestMethod call to force enumeration.
(Invoke-RestMethod -Uri "..." -Method Get) | select XXX,YY
方法更简单(如果您不这样做)实际上需要存储中间结果。
(...)
之所以可行,是因为通过管道始终发送存储在变量中的数组总是对其进行枚举(将其元素逐个发送)。
通过分配给变量,您可以消除输入N个对象的命令一个和一个输出 N-的命令之间的区别元素数组作为单个对象:
# Store array in a variable.
$array = Invoke-RestMethod -Uri "..." -Method Get
# An array stored in a variable sent through the pipeline is
# invariably enumerated.
$array | select X,Y
相反,如果您要做要通过管道发送存储在整个变量中的数组 ,则有两个选择:
# Send an array *as a whole* through the pipeline.
PS> (Write-Output -NoEnumerate (1..3) | Measure-Object).Count
1 # That is, the 3-element array was sent as *one* object
# Wrapping the command in (...) forces enumeration.
PS> ((Write-Output -NoEnumerate (1..3)) | Measure-Object).Count
3 # elements were sent *one by one*
# Store output-as-a-whole array in a variable,
# then send the variable through the pipeline -
# which also forces enumeration.
PS> $array = Write-Output -NoEnumerate (1..3); ($array | Measure-Object).Count
3 # elements were sent *one by one*