【发布时间】:2019-07-19 14:23:11
【问题描述】:
我正在查询一些 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}
这是返回的内容。 CPUUsage 值超过 40,除非数字以 5 或以上开头。就像最后一行只有 8%,而不是 40%。
【问题讨论】:
-
但是...您不是在比较数字 - 您是在比较字符串 :) 最简单的解决方法是交换操作数:
{40 -le $_.CpuUsage} -
不起作用,b/c 字符串被格式化为百分比(“47.16 %”),所以比较会抛出错误。如果您想稍后与它们进行数字比较,请不要将数字格式化为字符串。您可以将
Where-Object过滤器的输出通过管道传输到Format-Table以进行显示并在那里进行格式化。 -
谢谢!但是当我这样做时,我得到了这个错误。 --> 无法将值“43.78 %”转换为类型“System.Int32”。错误:“输入字符串的格式不正确。”
-
整数是小数还是%?
-
[double]('47.16 %' -replace '%')或者在选择之前过滤一下。
标签: powershell powercli