質問

オブジェクトのリストを返す2つのcmdletsがあります。 1つはプロパティIDを含む型spsolutionのオブジェクトを返し、もう1つはプロパティソリューションを使用して型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-featureによって返されるすべてのオブジェクトに対して、再びget-solutionを1回だけ実行します

$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用にフォーマットされたプロパティの配列です。
2つのオブジェクトを渡すために機能します。それがもっとうまくいくことを願っていますが、まだ試していません。

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

見る: PowerShellでは、2つのテーブルを1つに結合するための最良の方法は何ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top