You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell使用-gt比较数字返回错误结果问题

解决PowerShell中ESX主机CPU使用率筛选的字符串比较问题

我来帮你搞定这个问题!你遇到的是典型的字符串与数值比较混淆的坑,咱们一步步拆解解决:

问题根源

你用.ToString('P')把计算出的CPU使用率转换成了带%符号的字符串(比如"9%"、"8.08%"),这时候Where-Object里的-gt就变成了字符串字典序比较,而不是我们需要的数值大小比较。

举个例子:字符串"9%"的第一个字符是'9',它的ASCII码比"40%"的第一个字符'4'大,所以在字符串比较中"9%"会被判定为大于"40%",这就是为什么低使用率的主机也被错误筛选出来了。

解决方案1:先数值筛选,再格式化输出(推荐)

最稳妥的方式是先保留原始的使用率数值(0到1之间的小数)完成筛选,最后再格式化为百分比字符串输出:

Get-VMHost | 
    Select Name, 
        @{Name='CpuUsage';Expression={$_.CpuUsageMhz / $_.CpuTotalMhz}}, 
        @{Name='MemoryUsage';Expression={$_.MemoryUsageGB / $_.MemoryTotalGB}}, 
        @{N='NumVM';E={($_ | Get-VM).Count}} | 
    Where-Object {$_.CpuUsage -gt 0.4} |  # 用0.4代表40%的数值阈值
    Select Name, 
        @{Name='CpuUsage';Expression={$_.CpuUsage.ToString('P')}}, 
        @{Name='MemoryUsage';Expression={$_.MemoryUsage.ToString('P')}}, 
        NumVM

这种方式效率更高,也避免了字符串转换带来的潜在问题。

解决方案2:筛选时将字符串转回数值

如果你一定要先格式化再筛选,可以把字符串中的%符号去掉,转换成数值后再比较:

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 { [double]$_.CpuUsage.Replace('%','') -gt 40 }

这里通过Replace('%','')移除百分比符号,再强制转换成[double]类型,就能实现正确的数值比较了。

内容的提问来源于stack exchange,提问作者Johnny Cakes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:12:48