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

PowerShell comparing numbers using -gt returning false results

我正在查询一些 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%。

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

计算属性中的百分比是格式化字符串。将它们与整数进行比较将进行字符串比较,而不是数字比较,因为 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

实际上..我认为这可行..我在转换为百分比之前比较小数..

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