我使用哈希表来计算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完全按照预期工作。
此外,欢迎以更快的方式做到这一点的建议。我确信所有这些电话都可以做得更好。我把它完成了一行,但后来他们要求添加操作系统,这改变了一切。
答案 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
}