2010-04-20 3 views
5

У меня есть два CMDlets, которые возвращают списки объектов. Один возвращает объекты типа SPSolution, который содержит идентификатор свойства, а другой возвращает объекты типа SPFeature с свойством SolutionId.Присоединяйтесь к двум результатам в Powershell

Теперь я хочу присоединиться/объединить это что-то данные, как это:

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

ответ

5

Это не эффективно, и это предполагает PowerShell 2, но он должен делать свою работу:

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

Заметьте, что я у меня нет SharePoint, поэтому я боюсь, что не могу это проверить!

+0

Спасибо, он сделал свою работу. Но я действительно надеялся, что есть CMDlet для такого рода операций ... – Hinek

+1

Вот что-то очень, очень старое (с того момента, когда PowerShell все еще назывался Monad), который описывает командлет Join-Object. Он настолько старый, что использует другой синтаксис: http://www.leeholmes.com/blog/CreatingSQLsJoinlikeFunctionalityInMSH.aspx –

+1

Командлета Join-Object даже в PowerShell 2.0 отсутствует. –

2

Вот один вкладыш, который должен сделать трюк (зависит от вложенных трубопроводов):

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

Nice. Не понял, что вы можете сокращать «Имя» и «Выражение» до «n» и «e». Работает также в PS1. Хотя, не очень читаемый! ;) –

+0

Нет, не очень читаемый, но если вы набросились на подсказку, приятно иметь возможность делать. –

1

Это просто и, вероятно, может использовать больше работы, но это делает работу.

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 является блок сценария, и $proplist представляет собой массив свойств отформатированных для Select-Object.
Он работает для передачи в двух объектах. Надеюсь, что это сработает больше, но еще не пробовал.

3

Строительство того, что сказал Кейт Хилл Изготовление этого 2-футового вкладыша может значительно повысить эффективность. Таким образом, вы только запустить Get-Solution один раз вместо того, чтобы снова для каждого объекта, возвращенного Get-Feature

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