函数处理 PowerShell 管道中的意外行为
Unexpected behavior in function processing PowerShell pipeline
我创建了一个函数来处理我想要的对象中的项目并将它们分类到新的 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 语句,因为我一次只看到一个对象传递给它.
好的,我想我明白了...
如果您通过管道传递多个对象,则无需将结果相加。
我只是更改了代码以从 $newObject
中删除 [array]
和 +=
值,如下所示:
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
我还从函数中删除了输入参数,因为无论如何对象都会通过管道传递。
我创建了一个函数来处理我想要的对象中的项目并将它们分类到新的 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 语句,因为我一次只看到一个对象传递给它.
好的,我想我明白了...
如果您通过管道传递多个对象,则无需将结果相加。
我只是更改了代码以从 $newObject
中删除 [array]
和 +=
值,如下所示:
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
我还从函数中删除了输入参数,因为无论如何对象都会通过管道传递。