在Powershell中加入两个结果

在Powershell中加入两个结果,powershell,join,cmdlets,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 = $

我有两个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
$f=获取功能
$s=获取解决方案
$result=$f$s
$f.SolutionId=$s.Id
FeatureName=$f.DisplayName,SolutionName=$s.Name

它的效率不高,它采用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,因此我恐怕无法测试它

这里有一个单衬里可以实现这一点(依赖于嵌套管道):


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

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
}

$其中
是脚本块,
$proplist
是为选定对象格式化的属性数组
它适用于传入两个对象。希望它能起到更多的作用,但还没有尝试过。

以基思·希尔所说的为基础 将其制作为2衬板可大大提高效率。这样,对于Get特性返回的每个对象,您只需运行一次Get解决方案,而不是再次运行

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

请参阅:

谢谢,它完成了任务。但我真的希望有一个CMDlet用于此类操作…这里有一个非常非常古老的东西(从PowerShell还被称为Monad时开始),它描述了一个Join-Object CMDlet。它太旧了,使用了不同的语法:即使在PowerShell 2.0中也没有Join-Object cmdlet。@Kieth Hill:这篇文章描述了一个潜在的实现,而不是PowerShell的一部分。感谢这篇文章,我喜欢这个实现。遗憾的是,它只允许返回第一个或第二个数据源。我正在考虑从那里构建我自己的连接对象。。。或者开始悬赏建造它;-)美好的没有意识到你可以将“Name”和“Expression”缩写为“n”和“e”。也在PS1中工作。虽然,可读性不强!;)不,可读性不是很强,但是如果你在提示下把东西敲出来,能够做到这一点是很好的。
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id