Object 选择对象计算值的输出值
我使用了一个哈希表来计算VMWare清单脚本的一些值,但现在当我输出数据时,它将其记录为一个键/值对。我只想抛售价值。当我简单地拿着手中的东西时,效果很好,但当我变得挑剔时,PS开始阻碍我。:-) 以下是脚本的相关部分Object 选择对象计算值的输出值,object,powershell,select,key-value,Object,Powershell,Select,Key Value,我使用了一个哈希表来计算VMWare清单脚本的一些值,但现在当我输出数据时,它将其记录为一个键/值对。我只想抛售价值。当我简单地拿着手中的东西时,效果很好,但当我变得挑剔时,PS开始阻碍我。:-) 以下是脚本的相关部分 foreach ($machine in $vmList) { $vmname = $machine.Name $properties = @{ 'Name'=Get-VM $vmname | Select -ExpandProperty Name
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
}
如何使用DiskGB、Networks和TotalDiskGB只显示值,而不是像“@{TotalDiskGB=80}”这样的值?Ram、OS、CpuCount和Name已经完全按照预期工作了
此外,我们欢迎以更快的方式进行此操作的建议。我相信所有这些电话都可以做得更好。我只用一行就完成了,但后来他们要求添加操作系统,这改变了一切。简单但糟糕的方式:在指向
的表达式管道中,选择-ExpandProperty
仅获取值。例如:
'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
}
简单但不好的方法:在指向
的表达式管道中,选择-ExpandProperty
仅获取值。例如:
'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
}
+1但我还要补充的是,应该调用
getvm$vmname
一次,将结果存储在一个变量中,然后将其用于所有后续属性。对于同一个VM,在一次循环迭代中调用getGetVM
6次似乎效率极低。@briantist哦,天哪,是的!谢谢你指出这一点,我对他正在讨论的问题有了洞察,我甚至没有注意到这一点。请留下您的评论,但我会更新答案以反映这一点,以便更好地了解情况。啊,非常感谢。这与我最初的设想非常接近,但在推出操作系统的过程中遇到了困难。我不记得了,但我想我把它复杂化了。非常感谢你的帮助。我敢打赌它也跑得快多了。:-)哇,速度快得多,正是我想要的。+1但我还想补充一点,应该调用Get VM$vmname
一次,将结果存储在一个变量中,然后将其用于所有后续属性。对于同一个VM,在一次循环迭代中调用getGetVM
6次似乎效率极低。@briantist哦,天哪,是的!谢谢你指出这一点,我对他正在讨论的问题有了洞察,我甚至没有注意到这一点。请留下您的评论,但我会更新答案以反映这一点,以便更好地了解情况。啊,非常感谢。这与我最初的设想非常接近,但在推出操作系统的过程中遇到了困难。我不记得了,但我想我把它复杂化了。非常感谢你的帮助。我敢打赌它也跑得快多了。:-)哇,快多了,正是我想要的。