在Powershell中加入两个结果

时间:2010-04-20 09:17:47

标签: powershell join cmdlets

我有两个返回对象列表的CMDlet。一个返回SPSolution类型的对象,其中包含属性Id,另一个返回SPFeature类型的对象,其属性为SolutionId。

现在我想加入/合并这样的数据:

$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
          <ON> $f.SolutionId = $s.Id
          <SELECT> FeatureName = $f.DisplayName, SolutionName = $s.Name

5 个答案:

答案 0 :(得分:5)

它没有效率,它假设PowerShell 2但它应该完成这项工作:

$solutions = Get-Solution

foreach ($f in Get-Feature) {

    $filteredSolutions = $solutions |
        where-object { $_.Id -eq $f.SolutionId }

    foreach ($s in $filteredSolutions) {
        new-object PSObject -prop @{
            FeatureName = $f.DisplayName
            SolutionName = $s.Name
        }
    }
}

请注意,我没有安装SharePoint,所以我担心我无法测试它!

答案 1 :(得分:3)

建立Keith Hill所说的话 使其成为2衬里可以大大提高效率。这样,您只能为Get-Feature

返回的每个对象运行一次Get-Solution而不是一次
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}

答案 2 :(得分:2)

这是一个应该做的技巧(依赖于嵌套的管道):

Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}

答案 3 :(得分:1)

这很简单,可能会使用更多的工作,但它可以完成工作。

function Join-Object {
  param ( [PSObject[]] $objects, $where, $proplist)
    for ($i=0;$i -le $objects.length;$i++) {
      if ($objects[$i+1] -ne $null) {$out += $objects[$i] | %{$o=$_;$objects[$i+1] | where $where | Select -property $proplist} } };
  $out
}

$where是一个脚本块,$proplist是为Select-Object格式化的属性数组。
它适用于传递两个物体。希望它可以工作更多,但尚未尝试过。

答案 4 :(得分:0)

(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id

请参阅:In Powershell, what's the best way to join two tables into one?