我正在查询一些ESX主机统计信息,并将CPU时间转换为CPU%,然后使用Where-Object -gt
仅列出CPU大于80.00%的那些主机。但是我的查询返回的结果是CPU为9.00,因为9大于8,即使查询中有80.00。
这是我的查询:
Get-VMHost |
Select Name, @{Name='CpuUsage';Expression={($_.CpuUsageMhz / $_.CpuTotalMhz).ToString('P')}},
@{Name='MemoryUsage';Expression={($_.MemoryUsageGB / $_.MemoryTotalGB).ToString('P')}},
@{N='NumVM';E={($_ | Get-VM).Count}} |
Where-Object {$_.CpuUsage -gt 40}
这是返回的内容。除非数字以5或以上开头,否则CPUUsage
的值超过40。像最后一行一样,只有8%,而不是40%。
Name CpuUsage MemoryUsage NumVM ---- -------- ----------- ----- server1.com 47.16 % 52.82 % 14 server2.com 50.07 % 45.75 % 13 server3.com 56.07 % 46.13 % 12 server4.com 48.56 % 48.24 % 13 server5.com 53.21 % 53.59 % 14 server6.com 66.01 % 44.20 % 11 server7.com 54.41 % 46.37 % 13 server8.com 8.08 % 9.18 % 2
答案 0 :(得分:2)
计算的属性中的百分比为格式化字符串。将它们与整数进行比较将进行字符串比较,而不是数字比较,因为PowerShell将(尝试)调整第二个操作数的类型以匹配第一个操作数。
如果要对数据做进一步的操作,请不要在计算的属性中格式化值。如果需要格式化的输出,可以将Where-Object
过滤器的输出通过管道传输到Format-Table
并在那里进行格式化。
Get-VMHost |
Select Name, @{n='CpuUsage';e={$_.CpuUsageMhz / $_.CpuTotalMhz}},
@{n='MemoryUsage';e={$_.MemoryUsageGB / $_.MemoryTotalGB}},
@{n='NumVM';e={($_ | Get-VM).Count}} |
Where-Object {$_.CpuUsage -gt 0.4} |
Format-Table Name, @{n='CpuUsage';e={$_.CpuUsage.ToString('P')}},
@{n='MemoryUsage';e={($_.MemoryUsage.ToString('P')}}, NumVM
答案 1 :(得分:0)
实际上..我认为这是可行的..我在转换为百分比之前正在比较小数。.
Get-VMHost | Select Name,
@{n='CpuUsage';e={$_.CpuUsageMhz / $_.CpuTotalMhz}},
@{n='MemoryUsage';e={$_.MemoryUsageGB / $_.MemoryTotalGB}},
@{n='NumVM';e={($_ | Get-VM).Count}} |
Where-Object {$_.CpuUsage -gt 0.600} |
Format-Table Name, @{n='CpuUsage';e={$_.CpuUsage.ToString('P')}},
@{n='MemoryUsage';e={($_.MemoryUsage.ToString('P'))}},
NumVM