Domanda

Ho due cmdlet che restituiscono elenchi di oggetti. Si ritorna oggetti del tipo SPSolution, che contiene la proprietà Id, gli altri restituisce oggetti di tipo SPFeature con una proprietà SolutionId.

Ora voglio unire / fondere questo qualcosa di dati in questo modo:

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

Soluzione

Non è efficiente, e assume PowerShell 2 ma dovrebbe fare il lavoro:

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

Si noti che non ho SharePoint installato in modo temo che non posso provare questo!

Altri suggerimenti

Edificio fuori quello che Keith Hill ha detto Rendendolo un rivestimento 2 può migliorare notevolmente l'efficienza. In questo modo si esegue solo Get-Solution una volta invece di nuovo per ogni oggetto restituito da Get-Feature

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

Ecco una battuta che dovrebbe fare il trucco (si basa su tubazioni annidate):

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

È semplice e probabilmente potrebbe usare più lavoro, ma non il lavoro.

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 è un blocco di script, e $proplist è un array di proprietà formattati per Select-Object.
Funziona per il passaggio in due oggetti. Spero che avrebbe funzionato per di più, ma non ho ancora provato.

(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id

See: in PowerShell, qual è il modo migliore per unire due tavoli in uno?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top