【问题标题】:PowerShell comparing numbers using -gt returning false resultsPowerShell 使用 -gt 比较数字返回错误结果
【发布时间】: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%。

名称 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

【问题讨论】:

  • 但是...您不是在比较数字 - 您是在比较字符串 :) 最简单的解决方法是交换操作数:{40 -le $_.CpuUsage}
  • 不起作用,b/c 字符串被格式化为百分比(“47.16 %”),所以比较会抛出错误。如果您想稍后与它们进行数字比较,请不要将数字格式化为字符串。您可以将Where-Object 过滤器的输出通过管道传输到Format-Table 以进行显示并在那里进行格式化。
  • 谢谢!但是当我这样做时,我得到了这个错误。 --> 无法将值“43.78 %”转换为类型“System.Int32”。错误:“输入字符串的格式不正确。”
  • 整数是小数还是%?
  • [double]('47.16 %' -replace '%') 或者在选择之前过滤一下。

标签: powershell powercli


【解决方案1】:

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

【讨论】:

  • 谢谢!但是当我使用您的示例时,我没有得到任何 CPU 值。内存
  • 不要认为这行得通,因为在转换为百分比之前你怎么能有“where-Object {$_.CpuUsage -gt 40}”?
  • @JohnnyCakes 你是对的。参考值必须是 0.4 而不是 40。固定。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多