Присоединиться к двум результатам в Powershell - PullRequest
5 голосов
/ 20 апреля 2010

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

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

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

Ответы [ 5 ]

5 голосов
/ 20 апреля 2010

Это неэффективно, и предполагает 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, поэтому я боюсь, что не могу это проверить!

3 голосов
/ 24 февраля 2012

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

$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}
2 голосов
/ 20 апреля 2010

Вот одна строчка, которая должна добиться цели (опирается на вложенные конвейеры):

Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} | 
                 Select Name,@{n='FeatureName';e={$f.DisplayName}}}
1 голос
/ 02 сентября 2011

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

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.Это работает для прохождения в двух объектах.Надеюсь, это сработает для большего, но еще не попробовал.

0 голосов
/ 03 августа 2017
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id

См .: В Powershell, как лучше объединить две таблицы в одну?

...