代码之家  ›  专栏  ›  技术社区  ›  Hinek

在powershell中加入两个结果

  •  5
  • Hinek  · 技术社区  · 14 年前

    我有两个返回对象列表的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 回复  |  直到 7 年前
        1
  •  5
  •   Damian Powell    14 年前

    它不是高效的,它假设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,所以我恐怕无法测试这个!

        2
  •  3
  •   Chris Rudd    12 年前

    根据基思山的话 使其成为2列可以大大提高效率。这样,对于get特性返回的每个对象,只运行一次get解决方案,而不是再次运行一次。

    $Solutions = Get-Solution
    Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} | 
                     Select Name,@{n='FeatureName';e={$f.DisplayName}}}
    
        3
  •  2
  •   Keith Hill    14 年前

    这里有一个一行程序可以做到这一点(依赖于嵌套的管道):

    Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} | 
                     Select Name,@{n='FeatureName';e={$f.DisplayName}}}
    
        4
  •  1
  •   Chandra Sekhar    12 年前

    它很简单,可能需要更多的工作,但它确实做到了。

    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 是为选定对象设置格式的属性数组。
    它可以传递两个对象。希望它能起到更多的作用,但还没有尝试过。

        5
  •  0
  •   iRon    7 年前
    (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?