使用Powershell管道通过调用函数将动态属性添加到对象集合

时间:2014-03-25 21:35:47

标签: powershell

我有一个对象集合,每个对象都有一个名为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

我在我的函数中设置了一个断点,但是我没有得到调试停止。不知道如何使用管道为我的函数添加动态属性(部件)的集合。

2 个答案:

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