Joignez-vous à deux résultats dans Powershell
-
28-09-2019 - |
Question
J'ai deux CmdLets qui renvoient des listes d'objets. On revient des objets du SPSolution de type, qui contient la propriété Id, les autres déclarations des objets du type SPFeature avec une propriété SolutionId.
Maintenant, je veux me joindre / fusionner ce quelque chose de données comme ceci:
$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
<ON> $f.SolutionId = $s.Id
<SELECT> FeatureName = $f.DisplayName, SolutionName = $s.Name
La solution
Il est pas efficace, et il suppose PowerShell 2, mais il doit faire le travail:
$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
}
}
}
Notez que je n'ai pas SharePoint installé, donc je crains que je ne peux pas tester ça!
Autres conseils
Se appuyant sur ce que Keith Hill a dit Faire une doublure 2 peut grandement améliorer l'efficacité. De cette façon, vous exécutez une seule fois Get-Solution au lieu de nouveau pour chaque objet retourné par Get-Feature
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
Voici une seule ligne qui devrait faire l'affaire (repose sur des pipelines imbriquées):
Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
Il est simple et pourrait probablement utiliser plus de travail, mais il fait le travail.
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
est un bloc de script, et $proplist
est un ensemble de propriétés formatées pour Select-Object.
Il fonctionne pour passer dans deux objets. Espérons que cela fonctionnerait plus, mais n'a pas encore essayé.
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id
Voir: En Powershell, ce qui est la meilleure façon de joindre deux tables en un seul?