【发布时间】:2021-03-15 21:26:10
【问题描述】:
我正在尝试编写一个脚本,该脚本使用 OpenHardwareMonitor 获取 CPU 温度,如果它在给定的持续时间内平均高于某个阈值,则会发出警报。
获取当前温度工作正常,但我很难将它们平均起来,因为在某些系统上可能有一个或多个 CPU,所以我不能每分钟记录一次温度并除以经过的分钟数,下面是我所拥有的最好的(这不起作用),请一些好心人帮我看看我哪里出错了?
$tempThreshold = 80 # Will alert if average temperature is above this
$minutes = 3 # Duration in minutes to test for
start-process "$env:SystemRoot\TEMP\OpenHardwareMonitor\openhardwaremonitor.exe"
# Loop each minute
for ($i=1; $i -le $minutes; $i++) {
$arrSensors=@{}
if ((Get-WmiObject -Namespace "Root\OpenHardwareMonitor" -Query "SELECT * FROM Sensor WHERE Sensortype='Temperature'" | ? {$_.Name -match 'CPU Package'}).value) {
Get-WmiObject -Namespace "Root\OpenHardwareMonitor" -Query "SELECT * FROM Sensor WHERE Sensortype='Temperature'" | ? {$_.Name -Match "CPU Package"} | % {$arrSensors[$_.Name]=$_.Value}
} else {
Get-WmiObject -Namespace "Root\OpenHardwareMonitor" -Query "SELECT * FROM Sensor WHERE Sensortype='Temperature'" | ? {$_.Identifier -match 'cpu/'} | % {$arrSensors[$_.Name]=$_.Value}
}
$temps = foreach ($sensor in $arrSensors.getEnumerator()) {
Start-Sleep -Seconds 60
$temp = $temp+$sensor.value
}
}
# Alert if average above threshold
if ($temps/$minutes -gt $tempThreshold) {
Write-Host "Alert function here"
}
【问题讨论】:
-
顺便说一句,如果您将
Get-WmiObject -Namespace "Root\OpenHardwareMonitor" -Query "SELECT * FROM Sensor WHERE Sensortype='Temperature'"分配给 for 循环内的临时变量,您将不需要执行 3 次并进一步加热您的 CPU :-)。跨度>
标签: powershell loops average monitor temperature