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

时间:2019-07-19 14:23:11

标签: powershell powercli

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

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