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
相关产品推荐
相关产品推荐

