通过管道向函数发送输入时,函数应包括
Process
块:
function Test-PassArrayOfObjects
{
param(
[parameter(Mandatory,ValueFromPipeline)]
[object[]]$testArr
)
Process {
Write-Host "In function count: $($testArr.Count)"
$testArr | ForEach-Object { $_ }
}
}
这是必要的,因为我相信管道处理集合的方式。它会自动展开并一次处理一个项目,因此您的
ForEach-Object
没有得到整个系列
$testArr
变量
您经常看到这样的函数仍然包含
ForEach
不过,如果输入是通过参数发送的,那么它会一次收到。例如:
Test-PassArrayOfObjects -TestArr @(1,2,3)
.
数组有两个具有不同属性的对象,这一事实进一步混淆了您的问题。这会在输出中造成混淆,因为PowerShell决定如何基于第一个对象设置输出格式,并在输出第二个对象时使用相同的格式,但您看不到它,因为它不共享任何相同的属性(我认为这就是正在发生的情况……)。
您可以看到,这两个对象都是通过放置
| Format-List
上
$_
强制将两个输出单独格式化为列表输出。请注意,这当然不是实际功能场景中的良好实践。另一种方法是在两个对象上都设置属性名称
Test1
. 然后,您将看到您可能期望的输出,而不使用
Format-List
.