2017-11-07 24 views
0

別の計算されたプロパティに対して同じSELECT文で計算されたプロパティを使用する方法はありますか?あるいはこれを別に選ぶ必要がありますか?他の計算されたプロパティを使用して選択

VMwareのPowerCLIを使用して、ホストのメモリ統計(合計、プロビジョニング済み、%プロビジョニング済み)を生成しようとしています。最初select声明の中で

get-vmhost | sort Parent | 
    select Parent, Name, @{Name="MemoryTotalGB";E={[math]::Round($_.MemoryTotalGB)}}, @{Name="MemoryProvisionedGB";Expression={$_ | get-vm | measure -sum MemoryGB | select -ExpandProperty Sum}} | 
    select Parent, Name, MemoryTotalGB, MemoryProvisionedGB, @{Name="MemoryProvisionedPercentage";E={[math]::Round($_.MemoryProvisionedGB/$_.MemoryTotalGB * 100)}} | ft 

、私はMemoryProvisionedGBとしてホスト上で実行中のVMのメモリの合計を計算します。 2番目には、この合計を使用して%をプロビジョニングします。

%計算を生成するために、計算されたプロパティMemoryProvisionedGBを最初のselect文で何とか参照することはできますか?

答えて

0

計算されたプロパティを使用するのではなく、ForEach-Objectループを使用して[pscustomobject]を作成することができます。これにより、複数の変数を作成して再利用することができます。 (、BenHのForEach-Object提案は、よりエレガントではあるが)

Get-VMHost | 
    ForEach-Object { 
     $MemoryTotalGB = [math]::Round($_.MemoryTotalGB) 
     $MemoryProvisionedGB = ($_ | Get-VM | Measure-Object -Sum MemoryGB).Sum 
     [PSCustomObject]@{ 
      'Parent' = $_.Parent 
      'MemoryTotalGB' = $MemoryTotalGB 
      'MemoryProvisionedGB' = $MemoryProvisionedGB 
      'MemoryProvisionedPercentage' = [math]::Round($MemoryProvisionedGB/$MemoryTotalGB * 100) 
     } 
    } | 
    Sort-Object Parent | 
    Format-Table 
1

は、なぜあなたは一度だけ計算コレクションを持っていないのですか?

Get-VMHost | 
    Sort-Object -Property 'Parent' | 
    Select-Object -Property @(
    'Parent' 
    'Name' 
    @{ N = 'MemoryTotalGB' 
     E = {[Math]::Round($PSItem.MemoryTotalGB)} 
    } 
    @{ N = 'MemoryProvisionedGB' 
     E = {($PSItem | Get-VM | Measure-Object -Sum 'MemoryGB').Sum} 
    } 
    @{ N = 'MemoryProvisionedPercentage' 
     E = {[Math]::Round(($PSItem | Get-VM | Measure-Object -Sum 'MemoryGB').Sum/
          [Math]::Round($PSItem.MemoryTotalGB) * 100) 
      } 
    } 
) | Format-Table 
+1

Get-VM操作が高価になる可能性があるため、これは特に避けました。大量の在庫とリモート接続では、毛布のGet- *文が少なくなります。 – raidzero

+1

@raidzeroもしあなたがコストを心配しているなら、 'ForEach-Object'を利用するか、強制的に' Select-Object'ステートメントを使うべきです。 – TheIncorrigible1

関連する問題