`Invoke-RestMethod -Uri“ ...”-方法Get |选择X,Y在`(Invoke-RestMethod -Uri“ ...” -Method Get)时不返回任何行|选择X,Y`吗?

时间:2019-10-02 21:58:24

标签: powershell

我有一个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

1 个答案:

答案 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*