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