select-object计算值的输出值

时间:2014-10-30 22:43:34

标签: object powershell select key-value

我使用哈希表来计算VMWare库存脚本的某些值,但现在当我输出数据时,它会将其记录为键/值对。我想抛弃这个价值。当我简单地接受我所递给的那个工作正常,但是当我得到挑剔时,PS开始阻止我。 :-)

这是脚本的相关部分。

foreach ($machine in $vmList) {    
  $vmname = $machine.Name
  $properties = @{
     'Name'=Get-VM $vmname | Select -ExpandProperty Name
     'RAM'=Get-VM $vmname | Select -ExpandProperty MemoryGB
     'CpuCount'=Get-VM $vmname | Select -ExpandProperty NumCpu
     'UsedDiskGB'=Get-VM $vmname | Select-Object @{n="UsedDiskGB"; e={[math]::Round( $_.UsedSpaceGB, 3 )}}
     'TotalDiskGB'=Get-VM $vmname | Select-Object @{n="TotalDiskGB"; e={[math]::Round((Get-HardDisk -vm $_ | Measure-Object -Sum CapacityGB).Sum)}}
     'Networks'=Get-VM $vmname | Select-Object @{n="Networks"; e={(Get-NetworkAdapter -VM $_ |Sort-Object NetworkName |Select -Unique -Expand NetworkName) -join '; '}}
     'OS'=(Get-VM -Name $vmname | Get-View).summary.config.guestFullName
  }
  $object=New-Object -TypeName PSObject -Prop $properties

  Export-Csv -Path $WorkDir\vms.csv -Append -Encoding UTF8 -InputObject $Object 
  Write-Output $Object
}

如何让UsedDiskGB,Networks和TotalDiskGB只显示值而不是像@ {TotalDiskGB = 80}'? Ram,OS,CpuCount和Name完全按照预期工作。

此外,欢迎以更快的方式做到这一点的建议。我确信所有这些电话都可以做得更好。我把它完成了一行,但后来他们要求添加操作系统,这改变了一切。

1 个答案:

答案 0 :(得分:4)

简单但不好的方式:
在表达式管道中|Select -ExpandProperty <property name>只获取值。如:

'TotalDiskGB'=Get-VM $vmname | Select-Object @{n="TotalDiskGB"; e={[math]::Round((Get-HardDisk -vm $_ | Measure-Object -Sum CapacityGB).Sum)}}|select -expand totaldiskgb

更好的方式:
首先构建您的属性。试试这个:

'TotalDiskGB'= [math]::Round((Get-HardDisk -vm (Get-VM $vmname) | Measure-Object -Sum CapacityGB).Sum)

您遇到问题的原因是您使用Select创建PSCustomObject,而Totaldiskgb是该对象的属性。你不想制作一个对象,你只需要该属性的值。

编辑:感谢@briantist指出应该调用Get-VM $vmname一次,并将其存储为稍后要使用的对象,而不是每次需要时调用对于$Properties的成员。例如:

foreach ($machine in $vmList) {    
  $vmname = $machine.Name
  $vmobject = Get-VM $vmname
  $properties = @{
     'Name'=$vmobject | Select -ExpandProperty Name
     'RAM'=$vmobject | Select -ExpandProperty MemoryGB
     'CpuCount'=$vmobject | Select -ExpandProperty NumCpu
     'UsedDiskGB'=[math]::Round( $vmobject.UsedSpaceGB, 3 )
     'TotalDiskGB'=[math]::Round((Get-HardDisk -vm $vmobject | Measure-Object -Sum CapacityGB).Sum)
     'Networks'=(Get-NetworkAdapter -VM $vmobject |Sort-Object NetworkName |Select -Unique -Expand NetworkName) -join '; '
     'OS'=($vmobject | Get-View).summary.config.guestFullName
  }
  $object=New-Object -TypeName PSObject -Prop $properties

  Export-Csv -Path $WorkDir\vms.csv -Append -Encoding UTF8 -InputObject $Object 
  Write-Output $Object
}