Pregunta

Tengo dos cmdlets que devuelven listas de objetos. Uno devuelve objetos de la SPSolution tipo, que contiene la propiedad Id, los otros devuelve objetos de la SPFeature tipo con una propiedad SolutionId.

Ahora me quiero unir / combinar estos datos algo como esto:

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

Solución

No es eficiente, y se supone PowerShell 2, sino que debe hacer el trabajo:

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

Tenga en cuenta que no tengo instalado SharePoint así que me temo que no puedo probar esto!

Otros consejos

Edificio fuera de lo que Keith Hill dijo Por lo que es un revestimiento 2 puede mejorar mucho la eficiencia. De esta manera sólo ejecuta Get-Solución vez en lugar de nuevo para cada objeto devuelto por Get-Característica

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

Aquí hay una sola línea que debe hacer el truco (depende de tuberías anidados):

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

Es muy sencillo y probablemente podría utilizar más trabajo, pero hace el trabajo.

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 es un bloque de secuencia de comandos, y $proplist es una matriz de propiedades formateados para Select-Object.
Funciona para pasar en dos objetos. Espero que trabajaría para más, pero no lo he probado todavía.

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

Ver: En Powershell, ¿cuál es la mejor manera de unir dos tablas en una sola?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top