Junte -se a dois resultados em PowerShell
-
28-09-2019 - |
Pergunta
Eu tenho dois cmdlets que retornam listas de objetos. Um retorna objetos do tipo SPSolution, que contém o ID da propriedade, o outro retorna objetos do tipo de espuma com uma solução de propriedades.
Agora eu quero entrar/mesclar esses dados algo assim:
$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
<ON> $f.SolutionId = $s.Id
<SELECT> FeatureName = $f.DisplayName, SolutionName = $s.Name
Solução
Não é eficiente e assume o PowerShell 2, mas deve fazer o trabalho:
$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
}
}
}
Observe que eu não tenho o SharePoint instalado, por isso tenho medo de não testar isso!
Outras dicas
Construir o que Keith Hill disse que, tornando -o um revestimento de 2 pode melhorar bastante a eficiência. Dessa forma, você só executa a solução Get uma vez, em vez de novamente, para todos os objetos devolvidos pela Roda-Roda
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
Aqui está uma linha que deve fazer o truque (conta com oleodutos aninhados):
Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
É simples e provavelmente poderia usar mais trabalho, mas faz o trabalho.
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
é um bloco de script e $proplist
é uma variedade de propriedades formatadas para objeto selecionado.
Funciona para passar em dois objetos. Espero que funcione para mais, mas ainda não tentasse.
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id
Ver: Em PowerShell, qual é a melhor maneira de se juntar a duas mesas em uma?