Присоединяйтесь к двум результатам в PowerShell
-
28-09-2019 - |
Вопрос
У меня есть два команда, которые возвращают списки объектов. Один возвращает объекты типа SPSolution, который содержит идентификатор свойства, другой возвращает объекты типа типа SPFEAture с помощью свойства.
Теперь я хочу присоединиться / объединить эти данные что-то вроде этого:
$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
<ON> $f.SolutionId = $s.Id
<SELECT> FeatureName = $f.DisplayName, SolutionName = $s.Name
Решение
Это не эффективно, и он предполагает 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, поэтому я боюсь, что не могу проверить это!
Другие советы
Строительство от того, что сказал Кейт Хилл, что делает его на 2 лайнера, может значительно повысить эффективность. Таким образом, вы запускаете только Get-Solution один раз, вместо каждого объекта, возвращаемого Get-функцией
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
Вот одноклассник, который должен сделать трюк (полагается на вложенные трубопроводы):
Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
Это просто и может использовать больше работы, но это делает работу.
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
является массивом свойств, отформатированных для выбора-объекта.
Работает для прохождения в два объекта. Надеюсь, это будет работать больше, но еще не пробовала.
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id
Видеть: В PowerShell, какой лучший способ присоединиться к двум столам в один?