2010-04-20 6 views
5

ich zwei Cmdlets haben, die Listen von Objekten zurück. Man gibt Objekte des Typs SPSolution, die die Eigenschaft Id enthält, die anderen Erträge Objekte des Typs SPFeature mit einer Eigenschaft SolutionId.zwei Ergebnisse in Powershell Registriert

Jetzt will ich diese Daten so etwas wie dieses beitreten/merge:

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

Antwort

5

es nicht effizient ist, und es wird davon ausgegangen Powershell 2, aber es sollte die Arbeit machen:

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

Beachten Sie, dass ich Ich habe keine SharePoint installiert, also habe ich Angst, dass ich das nicht testen kann!

+0

Danke, es hat seinen Zweck erfüllt. Aber ich hatte wirklich gehofft, dass es für diese Art von Operation ein CMDlet gibt ... – Hinek

+1

Hier ist etwas sehr, sehr altes (seit wann PowerShell noch als Monad bekannt war), das ein Join-Objekt-Cmdlet beschreibt. Es ist so alt, dass es eine andere Syntax verwendet: http://www.leeholmes.com/blog/CreatingSQLsJoinlikeFunctionalityInMSH.aspx –

+1

Es gibt kein Join-Object-Cmdlet, selbst in PowerShell 2.0. –

2

Hier ist ein Einzeiler, die den Trick tun sollte (basiert auf verschachtelten Pipelines):

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

Nice. Hat nicht, dass du ‚Name‘ und ‚Ausdruck‘ zu ‚n‘ und ‚e‘ abkürzen könnte. Funktioniert auch in PS1. Obwohl, nicht sehr lesbar! ;) –

+0

Nein, nicht sehr gut lesbar, aber wenn man bei der Aufforderung alles ausschlägt, ist es schön, das tun zu können. –

1

Es ist einfach und wahrscheinlich mehr Arbeit verwenden können, aber es macht den Job.

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 ist ein Skript Block und $proplist ist ein Array von Eigenschaften für Select-Object formatiert.
Es funktioniert für die Übergabe von zwei Objekten. Hoffe es würde für mehr funktionieren, habe es aber noch nicht ausprobiert.

3

off Gebäude, was Keith Hill sagte So dass es ein 2-Liner erheblich die Effizienz verbessern. So kann man nur einmal statt wieder

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