6

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

现在我想加入/合并这些数据,如下所示:

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

5 回答 5

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,所以恐怕我无法对此进行测试!

于 2010-04-20T09:30:14.567 回答
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}}}
于 2012-02-24T01:39:20.280 回答
2

这是一个可以解决问题的单行代码(依赖于嵌套管道):

Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}
于 2010-04-20T15:29:31.230 回答
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 格式化的属性数组。
它适用于传入两个对象。希望它会工作更多,但还没有尝试过。

于 2011-09-01T21:44:18.537 回答
0
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id

请参阅:在 Powershell 中,将两个表合并为一个的最佳方法是什么?

于 2017-08-03T12:10:42.160 回答