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
Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top