読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Windowsバッチで,パソコンのCPUの温度をモニタリングしよう (WMIを使って過負荷・発熱しすぎを監視するWSHスクリプト)

WSH/JScript ハードウェア

CPUの温度を,5秒おきに定期的に表示するバッチ。

PCの発熱をモニタリングできる。

5秒おきに,温度が上がった(UP)か,下がった(DOWN)かを表示してくれる。


下記のバッチを,管理者権限で実行すること。

WSH・JScriptで記述してある。


CPU温度.bat

@if(0)==(0) ECHO OFF
cscript.exe //nologo //E:JScript "%~f0" %*
@pause
GOTO :EOF
@end


// 温度を計測する間隔
var measure_interval_ms = 5000;

// 一つ前のタイミングの温度
var temperature_old = null;


// 温度を表示する関数
function show_temperature(){

	// WMIをGetObject
	var obj_service = GetObject("winmgmts:\\\\.\\root\\WMI");
		// コンピュータ名「.」の前の\の個数を間違えると
		// 0x80041021 のエラーになる。
		// http://www.computerperformance.co.uk/Logon/code/code_80041021.htm

	// WQLで温度取得
	var record_set = obj_service.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature", "WQL", 48);

	var temperature_c;
	
	// Enumeratorを使って,結果セットを1行ずつ読み取る
	var e = new Enumerator( record_set );
	for( ; ! e.atEnd(); e.moveNext() )
	{
		// 1件分のレコードを取得
		var record = e.item();
		
		// 温度
		temperature_c = ( record.CurrentTemperature - 2732) / 10.0;
		
		var s = "";
		// 前回よりも温度が上がったら
		if( temperature_old < temperature_c ){
			s = "    ・→→UP ";
		}
		else
		// 前回よりも温度が下がったら
		if( temperature_old > temperature_c ){
			s = "DOWN←←・    ";
		}
		else
		{
			s = "    ・    ";
		}
		s += "(" + temperature_c + "℃)" + new Date();
		WScript.Echo(  s );
	}
	
	// 待つ
	WScript.Sleep( measure_interval_ms );
	
	// 今回の結果を保管
	temperature_old = temperature_c;
}


// 無限ループ
while(true){

	// 温度表示
	show_temperature();
	
}

何秒おきに温度を計測するかという間隔の部分は,自由に書き換えてOK。


注意点として,表示される温度はあまり正確ではないようだ。


WMIというWindowsの機能で温度を取得しているのだが,
PCのマザーボードの種類によって,
この機能に対応しているものと非対応のものがあるため。


まあ,おおまかな発熱の傾向はつかめる。

参考リンク(1)WMIによる温度取得の困難さについて

WMIだと正確な温度の値がとれない場合があり,かわりにWinRing0を使う:

CPU温度を取得する - ひらいて
http://d.hatena.ne.jp/s0u/20080524/12...

  • フリーの温度取得ソフトがCPU温度を取得している仕組みが気になって調べてみると、最近のCoreアーキテクチャのCPUにはDigital Thermal Sensor (DTS)というCPU温度を取得するためのCPU機能が搭載されているそうで、そいつを使っているらしい


Re[6]: CPUの温度を測定するプログラム
http://bbs.wankuma.com/index.cgi?mode...

  • 私も 5 年くらい前に試したことありますが、WMI ではまともな情報得られなかったですね。 > 最近はどうだか知りませんが。   正常に取れません・・・残念ながら。   取得できたマザーとOSの組み合わせがあったのなら、報告して下さい!


****CPUの温度取得方法について***表題の通り、CPUの温度を取得するプロ...
http://detail.chiebukuro.yahoo.co.jp/...

  • WMIはCPU温度で取得できない(サポートしていない)ものがある


ヘッダー
http://uchukamen.com/wpf/WinRing0/

  • 現在のPC “ASUS P5LD2-V”, eee PC 1000 HE では、このインターフェースはサポートされていないようで、CPU の温度をWMI経由で取得することはできませんでした。


CPU温度取得サンプル作成 WinRing0 | susumuのスペース
https://susumu5.wordpress.com/2009/05...

  • CPU温度(TjMaxまでのマージン)を取得する関数 // MSRレジスタ、0x19Cをリードした結果の eax[22:16]がデータ

WMIの難しさ:

WMIを使うスクリプトを簡単に作成する − @IT
http://www.atmarkit.co.jp/fwin2k/win2...

  • WMIは豊富な機能を持ち、メソッドやプロパティの数も膨大なので、スクリプトなどから利用するのは容易ではない


調べた事について紹介 CPU温度の検知方法について
http://tv4ak8b35rbp.blog60.fc2.com/bl...

  • ただし、「サポートしていないWindowsのバージョンが多い」「Windowsのバージョンなどによっては、UACが影響する場合がある」などの注意点があります


Getting CPU temp
https://social.msdn.microsoft.com/For...

  • If you're trying to do the Win32_TemperatureProbe through WMI and you're getting nothing back, it is most likely that your motherboard doesn't have the appropriate driver, needed to expose the value.

参考リンク(2)WMIの基本について

WMIの基礎:

メモリ・CPUなどハードウェアの構成情報を,バッチで取得しよう (WSH/JScriptでWMIを使う方法)
http://language-and-engineering.hatenablog.jp/entry/20100906/p1

  • WBEM((Windows Management Instrumentation)とは,ネットワーク経由でコンピュータを管理するための標準規格。
  • WMI(Windows Management Instrumentation)とは,マイクロソフトによるWBEMの実装。
  • WMIプロバイダとは,WBEM(WMI)に基づいて各種管理対象にアクセスするための窓口となるDLL。

WMIを使って温度情報を取得することは,一応可能:

MSAcpi_ThermalZoneTemperature - scriptinternals
http://www.scriptinternals.com/new/us...

  • CurrentTemperature
  • Data type: integer/usint32
  • Access type: Read-only
  • Temperature at thermal zone in tenths of degrees Kelvin


CPUの温度監視 - Windows 7 | 教えて!goo
http://oshiete.goo.ne.jp/qa/8672835.html

  • WindowsのWindows Management Instrumentation(WMI)から温度情報を得ることはできる

参考リンク(3)WSHのコード解説

WSHのGetObjectについて:

基礎解説 演習方式で身につけるチェック式WSH超入門:第11回 WScriptオブジェクトを利用する(2) (4/5) - @IT
http://www.atmarkit.co.jp/ait/article...

  • GetObjectメソッドを用いてWMIのサービス・オブジェクトを取得しているのがポイント
  • WMIのサービス・オブジェクトはExecQueryメソッドを持ち、その引数にクラス名(ここではWin32_Processor)を取得するためのクエリー(問い合わせ文字列)を指定し、オブジェクトのコレクションを得ている。
  • あとは、コレクションに含まれる各オブジェクトをFor〜Each〜Nextステートメントを用いて列挙し、そのプロパティを参照


WMIのimpersonationLevelについて - Miuran Business Systems
http://www.m-bsys.com/code/impersonat...

  • ネット上のサンプルでは「{impersonationLevel=impersonate}」と書いてあるものを多く見かけます。
  • オブジェクトが呼び出し元の資格情報を使用することができます。これはWMI呼び出しのためのスクリプティングAPIの推奨偽装レベルです。
  • 無指定時は「Impersonate(3)」が適用される


Windows管理者のためのWindows Script Host入門:第3回 WScriptオブジェクトの詳細(1) (2/3) - @IT
http://www.atmarkit.co.jp/ait/article...

  • GetObjectは、パラメータとしてファイル名を指定し、そのファイルを操作するためのオートメーション・オブジェクトを取得するメソッド
  • CreateObjectとは違い、すでにそのオブジェクトが存在していれば、新しいオブジェクトは作成せずに存在しているオブジェクトを返す


ファイルからオブジェクトを作成する - GetObject [WScript] [VBScript Tips]
http://www.happy2-island.com/vbs/cafe...

  • WScript.CreateObjectはアプリケーションを起動するためのメソッドで、ExcelやWordを起動する操作に似ています。そのため、ファイルを操作したいときは、起動後にファイルを開く操作が必要です。  
  • それに対し、WScript.GetObjectメソッドは、ファイルをダブルクリックして開く操作と似ています。

バッチのshebang記法:

BATとWSHのコードを1ファイルに混在させるためのshebang記法(複雑なバッチを1ファイルで実現)
http://computer-technology.hateblo.jp/entry/20131025/p1

参考リンク(4)PCの発熱をおさえる方法と意義

計測するためのフリーソフトなど:

フリーソフトで,PCのCPU使用率・メモリ利用量・CPU温度をタスクトレイに表示させよう。パフォーマンス情報アイコンを常駐
http://computer-technology.hateblo.jp/entry/20140506/p3

  • PCのパフォーマンス情報を,Windowsのシステムトレイ上に表示させよう。 おすすめのフリーソフト: CPU使用率は,「Monica」 メモリ利用量は,「MemInfo」 CPU温度は,「Core Temp」 いずれもフリーソフトで,通知トレイにアイコンでずっと数値を表示してくれる。


64bit Windows7で,CPUの温度や使用率をタスクトレイの通知領域に表示するフリーソフト「RealTemp」「My CPU monitor」「CleanMem」
http://computer-technology.hateblo.jp/entry/20140523/p5

  • CoreTempのかわりに、RealTempを使ってCPU温度をマルチコアで表示させる。 Monicaのかわりに、My CPU monitorを使ってCPU使用率を表示させる。


ノートPCのCPU温度は90度以上が長時間続くと危険。Coretempで計測して負荷を減らせ
http://computer-technology.hateblo.jp/entry/20140428/p4

  • CPUの温度が上がっても,心配し過ぎる必要はない。 上がり過ぎないようにCPU自身が,冷却ファンや処理速度を調節してくれる:

参考リンク(5)今回のコードの出典

類似のコード:

ノートPCが熱いのでCPU温度を計測 - 学び、そして考える
http://d.hatena.ne.jp/p-nix/20080527/p1
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature")
For Each objItem in colItems
WScript.Echo (objItem.CurrentTemperature - 2732) / 10.0
Next


CPU温度計: Windows Script Programming
http://scripting.cocolog-nifty.com/bl...
Set WMI=GetObject("winmgmts:\\.\root\WMI")
Sub window_onload
For Each oItem In WMI.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature")
t=(oItem.CurrentTemperature - 2732) / 10


Why this script does not work on XP or Vista
https://social.msdn.microsoft.com/For...
Dim objWMI = GetObject("winmgmts://" & strServer & "/root\WMI")
Dim objInstances = objWMI.InstancesOf("MSAcpi_ThermalZoneTemperature", 48)


CPU Temperature Monitor
http://geekswithblogs.net/cicorias/ar...

  • "SELECT * FROM MSAcpi_ThermalZoneTemperature",,48)


Anyone know of a way to dump CPU temps to a text file? - General PC Help - Malwarebytes Forum
https://forums.malwarebytes.org/index...

  • objWMIServ=GetObject("winmgmts://./root\WMI").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature","WQL",48)

その他の温度取得:

[WMI for VBS] HDDのS.M.A.R.T.情報を取得するサンプル: MSStorageDriver_FailurePredictData - WMI Sample
http://www.wmifun.net/sample/msstorag...

  • S.M.A.R.T.で取得できる例としてRaw Read Error Rate(データ読み込みエラーの割合)、Spin Up Time(決められた回転数に到達するまでの時間)、Power-On Hours(通電時間)、Spin Retry Count(スピンアップの再試行回数)、Temperature(温度)を取得しています。 S.M.A.R.T.で取得できる値はHDD/SSDメーカーによって異なる