选择使用其他计算属性

时间:2017-11-07 18:49:16

标签: powershell select

有没有办法在同一个select语句中为另一个计算属性使用计算属性。或者您是否需要另外选择此选项?

我正在使用VMware的PowerCLI尝试为主机生成一些内存统计信息(总计,配置,%配置)。

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

在第一个select语句中,我计算主机上运行的VM内存总和为MemoryProvisionedGB。在第二部分,我使用这笔金额来配置%。

是否有可能以某种方式引用第一个select语句中的计算属性MemoryProvisionedGB来生成%计算?

2 个答案:

答案 0 :(得分:1)

为什么不让你只计算一次收集(虽然BenH'} ForEach-Object建议更优雅?

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 :(得分:0)

您可以使用ForEach-Object循环创建[pscustomobject],而不是使用计算属性。这将允许您创建几个要重用的变量。

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