Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object 选择对象计算值的输出值_Object_Powershell_Select_Key Value - Fatal编程技术网

Object 选择对象计算值的输出值

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

我使用了一个哈希表来计算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
}
如何使用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,在一次循环迭代中调用get
GetVM
6次似乎效率极低。@briantist哦,天哪,是的!谢谢你指出这一点,我对他正在讨论的问题有了洞察,我甚至没有注意到这一点。请留下您的评论,但我会更新答案以反映这一点,以便更好地了解情况。啊,非常感谢。这与我最初的设想非常接近,但在推出操作系统的过程中遇到了困难。我不记得了,但我想我把它复杂化了。非常感谢你的帮助。我敢打赌它也跑得快多了。:-)哇,速度快得多,正是我想要的。+1但我还想补充一点,应该调用
Get VM$vmname
一次,将结果存储在一个变量中,然后将其用于所有后续属性。对于同一个VM,在一次循环迭代中调用get
GetVM
6次似乎效率极低。@briantist哦,天哪,是的!谢谢你指出这一点,我对他正在讨论的问题有了洞察,我甚至没有注意到这一点。请留下您的评论,但我会更新答案以反映这一点,以便更好地了解情况。啊,非常感谢。这与我最初的设想非常接近,但在推出操作系统的过程中遇到了困难。我不记得了,但我想我把它复杂化了。非常感谢你的帮助。我敢打赌它也跑得快多了。:-)哇,快多了,正是我想要的。