Unire due risultati in PowerShell
-
28-09-2019 - |
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
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?