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

PowerShell CPU使用率脚本异常:100%时无法触发阈值判断

问题原因

核心问题是字符串与数字的比较逻辑差异:

  • 当CPU使用率达到100%时,正则提取出的$doit是字符串类型的"100",而阈值$trashhold是数字类型的90。
  • PowerShell在比较不同类型操作数时,会将右侧的数字转换为左侧的字符串类型,再执行字典序比较。字符串"100"与"90"比较时,第一个字符"1"的ASCII码小于"9",因此"100" -gt "90"的结果为False,脚本便进入了else分支。
  • 而当使用率为99%及以下时,字符串"99"与"90"按字典序比较,"99"更大,所以比较结果为True,脚本能正常触发通知。
修复方案

有两种简洁的修复方式:

方式1:将提取的字符串转为数字类型

在正则提取后,显式把$doit转换为整数类型,确保比较时按数字逻辑执行:

$trashhold=90 
$doit=Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average | Select Average | Out-String

if ($doit -match "\d+"){ 
    $doit = [int]$matches[0]; # 转为整数类型
}

if ($doit -gt $trashhold)
{
    # send email bla bla
}
else 
{
    Write-Output "less than $trashhold, do nothing" # 修正变量名错误,将$limit改为$trashhold
}

方式2:直接获取数字类型的CPU平均值(更可靠)

完全不需要转字符串和正则提取,直接从Measure-Object的结果中获取数值,避免类型转换问题:

$trashhold = 90
$avgCpu = (Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average

if ($avgCpu -gt $trashhold) {
    # send email bla bla
} else {
    Write-Output "less than $trashhold, do nothing"
}

注:如果使用PowerShell 5.1及以上版本,推荐用Get-CimInstance替代已过时的Get-WmiObject:

$avgCpu = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:15:33