2010-04-20 99 views
5

我有兩個返回對象列表的CMDlet。一個返回SPSolution類型的對象,其中包含屬性Id,其他返回類型爲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 2010-04-20 11:52:33

+1

這是一個非常非常古老的東西(從PowerShell仍然稱爲Monad),它描述了一個Join-Object cmdlet。它太舊了,它使用了不同的語法:http://www.leeholmes.com/blog/CreatingSQLsJoinlikeFunctionalityInMSH.aspx – 2010-04-20 12:11:02

+1

即使在PowerShell 2.0中也沒有Join-Object cmdlet。 – 2010-04-20 15:28:02

2

這裏是一個一行應該做的伎倆(依賴於嵌套管道):

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

不錯。沒有意識到你可以將'姓名'和'表達'縮寫爲'n'和'e'。 PS1也可以使用。雖然,不是很可讀! ;) – 2010-04-20 16:15:28

+0

不,它的可讀性不是很高,但如果你在提示時敲出了一些東西,那麼能夠做到這一點是很好的。 – 2010-04-21 14:50:59

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-對象屬性的陣列。
它適用於傳入兩個對象。希望它能爲更多的工作,但還沒有嘗試過。

3

蓋基思希說什麼 使它成爲2班輪可以大大提高效率。這樣,你只能通過GET-功能返回的每個對象運行Get-解決方案,而不是一次再次

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