2010-04-20 33 views
5

Mam dwie CMDlety, które zwracają listy obiektów. Jeden zwraca obiekty typu SPSolution, które zawierają właściwość Id, a druga zwraca obiekty typu SPFeature z właściwością SolutionId.Połączyć dwa wyniki w Powershell

Teraz chcę dołączyć/połączyć te dane coś takiego:

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

Odpowiedz

5

To nie jest skuteczny, a to zakłada PowerShell 2, ale powinien wykonać zadanie:

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

pamiętać, że nie masz zainstalowanego SharePoint, więc obawiam się, że nie mogę tego przetestować!

+0

Dziękuję, że spełnił swoje zadanie. Ale naprawdę miałem nadzieję, że istnieje CMDlet dla tego rodzaju operacji ... – Hinek

+1

Oto coś bardzo, bardzo starego (od kiedy PowerShell był jeszcze znany jako Monad), który opisuje cmdlet Join-Object. Jest tak stary, że używa innej składni: http://www.leeholmes.com/blog/CreatingSQLsJoinlikeFunctionalityInMSH.aspx –

+1

Brak cmdletu Join-Object nawet w PowerShell 2.0. –

2

Oto jeden-liner, że powinno wystarczyć (opiera się na zagnieżdżonych rurociągów):

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

Nice. Nie zdawałem sobie sprawy, że możesz skracać "Nazwa" i "Wyrażenie" do "n" i "e". Działa również na PS1. Chociaż nie bardzo czytelny! ;) –

+0

Nie, niezbyt czytelny, ale jeśli walczysz z grą, dobrze jest móc to zrobić. –

1

To proste i prawdopodobnie mógłby użyć więcej pracy, ale spełnia swoje zadanie.

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 jest blok skryptowy, a $proplist jest szereg właściwości sformatowanych Select-przedmiotu.
Działa do przekazywania w dwóch obiektach. Mam nadzieję, że będzie działać więcej, ale jeszcze go nie wypróbowałem.

3

Zbudowanie tego, co powiedział Keith Hill. Wykonywanie 2 linerów może znacznie poprawić wydajność. W ten sposób można uruchomić tylko raz Get-rozwiązanie zamiast ponownie dla każdego obiektu zwróconego przez Get-Feature

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