Join two results in Powershell
-
28-09-2019 - |
Question
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
Solution
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!
OTHER TIPS
Building off what Keith Hill said Making it a 2 liner can greatly improve efficiency. This way you only run Get-Solution once instead of again for every object returned by Get-Feature
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
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}}}
It's simple and could probably use more work, but it does the job.
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
is a script block, and $proplist
is an array of properties formatted for Select-Object.
It works for passing in two objects. Hope it would work for more, but haven't tried it yet.
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id
See: In Powershell, what's the best way to join two tables into one?