我有两个cmdlet返回对象列表。一个返回包含属性ID的类型SPSOLUTION的对象,另一个返回使用属性解决方案ID的类型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,所以恐怕无法测试!

其他提示

建立基思·希尔(Keith Hill)所说的,使其成为2班轮可以大大提高效率。这样,您只需运行一次速度解决方案,而不是再次使用get-feature返回的每个对象

$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 是针对Select-Object格式化的属性数组。
它用于传递两个对象。希望它可以使用更多,但还没有尝试过。

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

看: 在Powershell中,将两个桌子加入一张桌子的最佳方法是什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top