Windows下的WMI里提供了MSAcpi_ThermalZoneTemperature接口的,调用一下即可。
WMI即Windows Management Instrumentation,是一个Windows管理工具/模块,可以从这里获得大部分你需要的系统信息。
1. 以管理员身份启动powershell,输入以下命令:
function Get-Temperature {
$t = Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi"
$returntemp = @()
foreach ($temp in $t.CurrentTemperature)
{
$currentTempKelvin = $temp/10
$currentTempCelsius = $currentTempKelvin - 273.15
$currentTempFahrenheit = (9/5) * $currentTempCelsius + 32
$returntemp += $currentTempCelsius.ToString() + " C : " + $currentTempFahrenheit.ToString() + " F : " + $currentTempKelvin + "K"
}
return $returntemp
}
Get-Temperature
结果如下(因为我的电脑主板有8个温区,所以显示了8个温度):
2. 这样堆积显示的比较乱,如果想单独看主板某个区域的温度,可先通过如下命令获取主板区域各接口的 InstanceName 信息:
Get-CimInstance -Namespace root/WMI -ClassName MSAcpi_ThermalZoneTemperature
划红线处这就是主板各区域接口的 InstanceName (CPUZ_0就代表CPU Zone):
再通过如下代码获取该区域温度(记得替换对应的InstanceName):
"CPU: $(((Get-CimInstance -Namespace root/WMI -ClassName MSAcpi_ThermalZoneTemperature | where InstanceName -eq "ACPI\ThermalZone\CPUZ_0").CurrentTemperature - 2731.5) / 10) C"
结果如下(CPU区域的CPUZ_0当前温度为75.05℃) :
不过上述方法都只能获取主板各区域的温度,无法获得确切的CPU温度。
主要是因为CPU温度等信息在MSR寄存器或PCI配置空间中,而读取MSR的两条汇编指令:WRMSR 和RDMSR都是特权指令,普通应用层面无法使用该指令。不嫌麻烦的话,可以写个适配当前电脑主板硬件的底层驱动,来获取电脑的CPU温度信息......
其实这都是Windows的历史遗留问题,Windows设计之初就没想着像Linux一样给CPU温度留API调用接口.....
所以现在只能凑合着看个主板温区了,除非有精力像鲁大师那种去写适配硬件的底层驱动......