我想从属性具有最高值的数组中返回一个对象。目前我正在做以下事情
Get-VM | Sort-Object -Property ProvisionedSpaceGB | Select-Object -Last 1
这有效但效率低下。我不需要对整个数组进行排序,我只需要具有最大值的对象。理想情况下,我会使用类似的东西
Get-VM | Measure-Object -Property ProvisionedSpaceGB -Maximum
但这仅返回对象属性的值,而不是整个对象。有没有办法让测量对象返回基础对象?
最佳答案
不直接。 Measure-Object
旨在成为获取这些值的简单方法,而不是它们的输入对象。您可以从 Measure-Object 获取最大值,然后与数组进行比较,但这需要几个步骤:
$array = Get-VM
$max = ($array | measure-object -Property ProvisionedSpaceGB -maximum).maximum
$array | ? { $_.ProvisionedSpaceGB -eq $max}
您也可以完全放弃 Measure-Object 并遍历该集合,随时替换最大值和输出。
$max = 0
$array | Foreach-Object
{
if($max -le $_.ProvisionedSpaceGB)
{
$output = $_
$max = $_.ProvisionedSpaceGB
}
}
$output
这有点脏,以便始终返回单个值。如果您要在可能有多个具有相同最大值的值(例如,使用 Get-ChildItem 时的文件大小长度)的情况下重用它,则需要稍作调整。它将取代
$output
后者在两个或多个对象具有相同值的情况下迭代 ProvisionedSpaceGB
.你可以转$output
很容易地放入一个集合中来解决这个问题。我自己更喜欢前一种解决方案,但我想提供一种不同的方式来思考这个问题。
关于powershell - 从数组中返回具有最高值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18966533/