MSAcpi_ThermalZoneTemperatureとvendor sensorを使う前に、端末がどの実装を呼び、どの対象を読むかを確認してください。PowerShellでCPU温度をモニタリングする方法の結論は「PowerShellだけで全PCのCPU温度を正確に取る標準cmdletはありません。MSAcpi_ThermalZoneTemperatureは利用可否とsensor identityを確認する参考値に留め、hardware vendorの管理APIや監視agentを優先します。」。Windows標準classは機種により未実装で、返るthermal zoneがCPU package温度とは限らない環境で、未確認の変更を避けるための順番を示します。
ACPI thermal zone classの有無を調べる
CPU温度は、すべてのPCでWindowsの標準CIMクラスから取得できるわけではありません。root/wmiのMSAcpi_ThermalZoneTemperatureが返る機種だけを対象に、InstanceNameと生値の単位を確認し、摂氏へ変換します。値が空、不変、異常範囲ならメーカーの監視機能を使い、推定値を実測として記録しません。
- Get-CimClass root/wmiでclass存在を確認する
- 複数thermal zoneのInstanceNameとsampling可能性を確認する
- vendor BIOS/management toolのsensor名と照合する
- 温度閾値、sampling間隔、log保持先を運用で定義する
CurrentTemperatureの単位を摂氏へ変換する
class存在を読む
Get-CimClass -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction SilentlyContinue
classなしはPowerShell不具合ではなくfirmware/provider非対応の場合があります。
全thermal zoneを表示
Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction SilentlyContinue |
Select-Object InstanceName,CurrentTemperature,CriticalTripPoint
一件目だけをCPU温度と断定しません。
Kelvin tenthを摂氏へ変換
Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature |
Select-Object InstanceName,@{n='Celsius';e={[math]::Round(($_.CurrentTemperature/10)-273.15,1)}}
raw値が10分のKelvinというclass仕様に基づく換算です。sensor identityの問題は換算で解決しません。
thermal zoneを60秒だけsample
1..6 | ForEach-Object {
$now=Get-Date
Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction SilentlyContinue |
Select-Object @{n='Time';e={$now}},InstanceName,CurrentTemperature
Start-Sleep -Seconds 10
}
無限loopを避け、まず一分のsampleで値が変化するか確認します。
CPU loadと同時刻に記録
Get-Counter '\Processor(_Total)\% Processor Time' -SampleInterval 2 -MaxSamples 5
温度との相関を見る補助です。CPU counterだけでsensorの正しさを証明しません。
thermal zoneをCPU package温度と断定しない
読取は通常安全ですが、高頻度pollingや無限loopはWMI providerとlog diskへ負荷をかけます。sampling数と間隔、timeout、log rotationを設定します。温度を下げるためにsecurity serviceやfan制御を無効化せず、異常時はworkload停止、冷却・dust・firmware確認をhardware手順で行います。sensor tool導入はpublisherと署名を確認し、uninstallと設定rollbackを用意します。
sampling回数と間隔に上限を置く
CurrentTemperatureが一定、空、極端でもCPU故障と断定しません。ACPI thermal zoneはmotherboardやchassis zoneの場合があります。modern CPUにはpackage/core別sensorがあり、vendor APIの名称と単位を確認します。閾値はCPU model、冷却設計、workloadに依存し、一般値をalarmへ固定しません。
CPU loadと温度を同時刻で相関する
- thermal zoneをCPU packageと断定する
- 2732を引く式だけを正しさの根拠にする
- 無限loopでlogを増やす
- 一つの固定閾値を全機種へ使う
- 非公式sensor driverを無検証で導入する
classなし環境ではvendor telemetryへ切り替える
BIOS hardware monitorまたはvendor management consoleと同時刻に比較し、InstanceNameごとにidle/load時の変化を見ます。classなし、null、複数zoneを正常な状態として処理できるscriptにします。取得不能なら推測値を出さずunsupportedと記録します。
zone identityと現実的な温度範囲を検収する
MSAcpi_ThermalZoneTemperatureは一部hardwareが公開するACPI thermal zoneで、CPU package温度を必ず返すAPIではありません。CurrentTemperatureは0.1 Kelvinなので摂氏へ変換し、classなし・0件・invalid値を『CPU 0度』に置換しません。
ACPI raw値を摂氏へ変換して保存する
$zones=@(Get-CimInstance -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction Stop)
$zones | ForEach-Object { $c=($_.CurrentTemperature/10)-273.15; [pscustomobject]@{Zone=$_.InstanceName;Raw=$_.CurrentTemperature;Celsius=[math]::Round($c,1);Valid=($c -gt -50 -and $c -lt 150)} }
thermal zone非対応をCIM例外から判断する
- thermal zone取得:各InstanceNameのraw値が妥当範囲にあり、Celsius=(raw/10)-273.15で時系列を得る
- class非対応:classなし/0件はUnsupportedOrUnavailableとして明示し、温度正常と判定しない
- CIM・値域error:Access denied、provider error、raw値0や異常範囲はRejectedSampleとして別件数にする
thermal zone名はCPU coreと一対一ではなく、firmware/virtual machineで値が無いことがあります。単発値からthrottlingを断定せず、vendor telemetryやBIOS sensorと照合します。無限loopで高頻度pollingしません。
異常raw値と複数zoneを試す
try { $class=Get-CimClass -Namespace root/wmi -ClassName MSAcpi_ThermalZoneTemperature -ErrorAction Stop; [pscustomobject]@{State='ClassAvailable';Name=$class.CimClassName} } catch { [pscustomobject]@{State='UnsupportedOrUnavailable';Category=$_.CategoryInfo.Category} }
classなし、0 zone、複数zone、raw 0、sampling中消失をtestします。zone名、raw/Celsius、取得時刻、sample間隔、CPU loadを保存し、別sensorとの差を記録します。
MSAcpi_ThermalZoneTemperatureが返すのはfirmware公開のthermal zoneで、CPU core温度とは限りません。zone名、raw値、変換式を残し、取得不能を0℃として記録しないでください。

コメント