我有一个对象集合,每个对象都有一个名为ProductName的属性。我还定义了一个函数来获取产品的零件:
function GetParts([string] ProductName))
{
$parts = @()
....
return $parts
}
我需要的是使用管道循环每个对象并通过调用我的函数将“Parts”作为另一个属性添加到对象,最后将集合输出到表视图:
$products | Sort-Object ProductName | Select-Object `
-Property ProductName, `
@{Expression=(GetParts $_.ProductName); Label="Parts"} | `
Format-Table ProductName, Parts
我在我的函数中设置了一个断点,但是我没有得到调试停止。不知道如何使用管道为我的函数添加动态属性(部件)的集合。
答案 0 :(得分:2)
要让它接受管道中的值,请使用参数选项ValueFromPipeline
,如下所示:
function GetParts{
Param(
[parameter(ValueFromPipeline = $true)]
[string]$ProductName
)
Process{
$parts = @()
....
return New-Object PSObject -Property @{ProductName=$ProductName;Parts=$parts}
}
}
这将返回具有所需属性的对象,并接受管道中的值。
答案 1 :(得分:2)
计算属性中的表达式必须使用大括号,而不是括号。改变这个:
Select-Object -Property ProductName, `
@{Expression=(GetParts $_.ProductName); Label="Parts"}
进入这个:
select ProductName, @{Label='Parts';Expression={GetParts $_.ProductName}}