Powershell 选择“使用其他计算属性”

Powershell 选择“使用其他计算属性”,powershell,select,Powershell,Select,是否有方法将同一select语句中的计算属性用于另一个计算属性。或者你必须为这个选择另一个单独的选项吗 我正在使用来自VMware的PowerCLI来尝试为主机生成一些内存统计数据(总计、已配置、%已配置) get-vmhost | sort Parent | select Parent, Name, @{Name="MemoryTotalGB";E={[math]::Round($_.MemoryTotalGB)}}, @{Name="MemoryProvisionedGB";Expres

是否有方法将同一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
,以生成%calculation?

而不是使用计算属性,您可以使用每个对象的
循环并创建
[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

为什么不计算一次集合(尽管BenH的
ForEach对象
建议更优雅)


我特别避免了这一点,因为Get-VM操作可能非常昂贵。使用大量库存和远程连接时,Get-*语句越少越好。@raidzero如果您担心成本,则应使用每个对象的
语句,或者强制使用双
选择对象的
语句。
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