1

我创建了一个函数来处理我想要的对象中的项目并将它们分类到一个新的 PSCustomObject 中。如果我通过管道传递对象,我会得到一些重复和奇怪的结果,而不是将对象作为参数传递给函数并使用 ForEach-Object 循环。

这是我的示例(这将产生 3 条记录):

$audioSessions | Where-Object {$_.QoeReport.FeedbackReports}

与此相反(产生六个,有些是重复的:

$audioSessions | Where-Object {$_.QoeReport.FeedbackReports} | ProcessFeedback

这是输出的差异: 在此处输入图像描述

知道为什么会发生这种情况吗?我将 3 个对象传递给 ProcessFeedback 函数,不是吗?为什么有些项目重复而有些则没有?

如果我选择将整个变量传递给函数并在其中循环,我会按预期从函数中取回 3 个对象:

ProcessFeedback -feedbackInput $audioSessions

然后,在我的函数中,我使用 Where-Object 语句进行过滤,结果如下:

function ProcessFeedback{
  [cmdletbinding()]
  Param(
    [Parameter(mandatory=$true, valuefrompipeline=$true)]
    $feedbackInput
  )
  begin{}
  process{
    $feedbackInput | Where-Object {$_.QoeReport.FeedbackReports} | ForEach-Object{
      [array]$newObject += [PSCustomObject][ordered]@{
        FromUri = $_.FromUri
        ToUri = $_.ToUri
        CaptureTime = $_.QoeReport.FeedbackReports.CaptureTime
        Rating = $_.QoeReport.FeedBackReports.Rating
      }
    }
    return $newObject
  }
}

注意:当我通过管道传递对象时,我删除了 ProcessFeedback 函数中的 Where-Object 语句,因为我一次只看到一个对象传递给它。

4

1 回答 1

0

好吧,我想我想通了……

如果您通过管道传递多个对象,则无需将结果相加。

我只是更改了代码以删除[array]+=值,$newObject如下所示:

function ProcessFeedback{
  begin{}
  process{
      $newObject = [PSCustomObject][ordered]@{
        FromUri = $_.FromUri
        ToUri = $_.ToUri
        CaptureTime = $_.QoeReport.FeedbackReports.CaptureTime
        Rating = $_.QoeReport.FeedBackReports.Rating
      }
    }
    return $newObject
  }
}

然后像这样运行它:

[array]$arrFeedbackResults += $audioSessions | Where-Object {$_.QoeReport.FeedbackReports} | ProcessFeedback

我还从函数中删除了输入参数,因为无论如何对象都通过管道传递。

于 2017-06-28T17:01:20.367 回答