Pergunta

Eu tenho dois cmdlets que retornam listas de objetos. Um retorna objetos do tipo SPSolution, que contém o ID da propriedade, o outro retorna objetos do tipo de espuma com uma solução de propriedades.

Agora eu quero entrar/mesclar esses dados algo assim:

$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
          <ON> $f.SolutionId = $s.Id
          <SELECT> FeatureName = $f.DisplayName, SolutionName = $s.Name
Foi útil?

Solução

Não é eficiente e assume o PowerShell 2, mas deve fazer o trabalho:

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

Observe que eu não tenho o SharePoint instalado, por isso tenho medo de não testar isso!

Outras dicas

Construir o que Keith Hill disse que, tornando -o um revestimento de 2 pode melhorar bastante a eficiência. Dessa forma, você só executa a solução Get uma vez, em vez de novamente, para todos os objetos devolvidos pela Roda-Roda

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

Aqui está uma linha que deve fazer o truque (conta com oleodutos aninhados):

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

É simples e provavelmente poderia usar mais trabalho, mas faz o trabalho.

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 é um bloco de script e $proplist é uma variedade de propriedades formatadas para objeto selecionado.
Funciona para passar em dois objetos. Espero que funcione para mais, mas ainda não tentasse.

(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id

Ver: Em PowerShell, qual é a melhor maneira de se juntar a duas mesas em uma?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top