2010-04-20 41 views
5

Tengo dos CMDlets que devuelven listas de objetos. Uno devuelve objetos del tipo SPSolution, que contiene el Id de propiedad, el otro devuelve objetos del tipo SPFeature con una propiedad SolutionId.Unir dos resultados en Powershell

Ahora quieren unirse/fusionar 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 

Respuesta

5

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

en cuenta que yo ¡No tengo instalado SharePoint así que me temo que no puedo probar esto!

+0

Gracias, cumplió con su cometido. Pero realmente esperaba que hubiera un CMDlet para este tipo de operación ... – Hinek

+1

Aquí hay algo muy, muy antiguo (desde cuando aún se conocía a PowerShell como Monad) que describe un cmdlet Join-Object. Es tan viejo que usa una sintaxis diferente: http://www.leeholmes.com/blog/CreatingSQLsJoinlikeFunctionalityInMSH.aspx –

+1

No hay ningún cmdlet Join-Object incluso en PowerShell 2.0. –

2

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}}} 
+0

Nice. No me di cuenta de que podría abreviar 'Nombre' y 'Expresión' a 'n' y 'e'. Funciona en PS1 también. Aunque no es muy legible! ;) –

+0

No, no es muy fácil de leer, pero si estás golpeando cosas en el prompt, es bueno poder hacerlo. –

1

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 script, y $proplist es una matriz de propiedades formateados para Select-Object.
Funciona para pasar dos objetos. Espero que funcione para más, pero aún no lo he probado.

3

Construyendo lo que Keith Hill dijo Hacerlo un trazador de líneas 2 puede mejorar grandemente eficacia. De esta manera sólo ejecuta Get-Solución vez en lugar de nuevo para cada objeto devuelto por Get-Feature

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