views:

113

answers:

2

I've got two CMDlets that return lists of objects. One returns objects of the type SPSolution, which contains the property Id, the other returns objects of the type SPFeature with a property SolutionId.

Now I want to join/merge this data something like this:

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

It's not efficient, and it assumes PowerShell 2 but it should do the job:

$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
        }
    }
}

Note that I don't have SharePoint installed so I'm afraid that I can't test this!

Damian Powell
Thank you, it did the job. But I was really hoping that there is a CMDlet for this kind of operation...
Hinek
Here's something very, very old (from when PowerShell was still known as Monad) which describes a Join-Object cmdlet. It's so old it uses a different syntax though: http://www.leeholmes.com/blog/CreatingSQLsJoinlikeFunctionalityInMSH.aspx
Damian Powell
There is no Join-Object cmdlet even in PowerShell 2.0.
Keith Hill
@Kieth Hill: the article describes a potential implementation, not something that is part of PowerShell.
Damian Powell
@Damian Powell - thanks for the article, I like the implementation. A pity that it only allows to return the first OR the second data source. I'm thinking about building my own Join-Object from there ... or starting a bounty for building it ;-)
Hinek
+1  A: 

Here's a one-liner that should do the trick (relies on nested pipelines):

Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}
Keith Hill
Nice. Didn't realise you could abbreviate 'Name' and 'Expression' to 'n' and 'e'. Works in PS1 too. Although, not hugely readable! ;)
Damian Powell
No, not hugely readable but if you're banging stuff out at the prompt, it is nice to be able to do.
Keith Hill