1

Тема: VBS: Замер температуры HDD

Доброго времени суток всем!

столкнулся с небольшой проблемочкой в контроле температуры жесткого диска, дабы не вышел из строя. Так вот на просторах сети увидел решение небольшое: с помощью WMI данный аспект возможно разрешить с помощью получения параметров при просмотре контейнера MSStorageDriver_ATAPISmartData

и вот собственно сам код:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM MSStorageDriver_ATAPISmartData",,48)
For Each objItem in colItems
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "MSStorageDriver_ATAPISmartData instance"
    Wscript.Echo "-----------------------------------"
    If isNull(objItem.VendorSpecific) Then
        Wscript.Echo "VendorSpecific: "
    Else
        Wscript.Echo "VendorSpecific: " & Join(objItem.VendorSpecific, ",")
    End If
Next

за недостатком знаний и возникает вопрос: где именно в возвращаемых данных именно наша температура нужного(конкретного) Диска

подскажите как возможно реализовать вывод информации по конкретному диску ( если их в системе несколько)

за ранее спасибо

2

Re: VBS: Замер температуры HDD

Вот здесь инфа немного раскрывается...

Времени не хватает... :-(

3

Re: VBS: Замер температуры HDD

После запроса к классу MSStorageDriver_ATAPISmartData, в массиве VendorSpecific (который является свойством экземпляра указанного класса) нужно найти значение VendorSpecific(i) = 194 и запомнить индекс массива i.  Элемент VendorSpecific(i+5) содержит значение температуры жесткого диска:

VBScript


'----------------------------------------
' Температура жестких дисков
' VBScript
'----------------------------------------
 Option Explicit 

 Dim objService, objAcpi, obj
 Dim i, lTemp

 Set objService = GetObject("winmgmts:\\.\Root\WMI")
 Set objAcpi = objService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData")

'----------------------------------------
 For Each obj In objAcpi

	For i = 0 To UBound(obj.VendorSpecific)

		If obj.VendorSpecific(i) = 194 Then 
			WScript.Echo obj.GetObjectText_
			WScript.Echo _
				"Диск: " & obj.InstanceName & vbCRLF & _
				"Температура: " & CStr(obj.VendorSpecific(i + 5)) & Chr(176) & " C"
			Exit For
		End If

	Next

 Next		

Пример с периодическим опросом температуры жестких дисков и выводом данных в консоль:

VBScript


'----------------------------------------
' Получение температуры накопителей с 
' отображением в консоли CScript
' VBScript
'----------------------------------------

 Option Explicit

 Dim oWshShell, objService, objAcpi, obj, u
 Dim sF, sImage, b, sStr, i, j
 Dim i1(10)

 '--------------------------------------------------------
 Set oWshShell = CreateObject("WScript.Shell")

 ' Запуск сценария консольным интерпретатором CScript
 '--------------------------------------------------------
 sF = CStr(WScript.FullName)
 sImage = Right(sF,Len(sF)-InStrRev(sF, "\"))

 If StrComp(UCase(sImage),"WSCRIPT.EXE") = 0 Then
	oWshShell.Run "CScript.exe" & Chr(32) & """" & WScript.ScriptFullName & """", 1, False
	WScript.Quit()
 End If

 ' Получение температуры накопителей
 '--------------------------------------------------------
 Set objService = GetObject("winmgmts:\\.\Root\WMI")
 b = False
 sStr = vbNullString

 While 1

	WScript.StdOut.Write sStr
	sStr = vbNullString
	
	' Получение температуры накопителей
	'-------------------------------------------------
	Set objAcpi = objService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData")

	For j = 0 To objAcpi.Count - 1

		Set obj = objAcpi.ItemIndex(j)
		If Not b Then
			For i = 0 To UBound(obj.VendorSpecific) - 1
				If obj.VendorSpecific(i) = 194 Then
					i1(j) = i + 5
					Exit For
				End If
			Next
		End If
		
		sStr = sStr & Time() & vbCRLF & _
			"Диск: " & obj.InstanceName & vbCRLF & _
			"Температура: " & CStr(obj.VendorSpecific(i1(j))) & Chr(176) & " C" & vbCRLF & vbCRLF

		Set obj = Nothing
	Next		
	
	b = True
	Set objAcpi = Nothing


	WScript.Sleep(3000)

	' Очистка консоли (идея wisgest http://forum.script-coding.com/viewtopic.php?pid=80670#p80670)
	'-------------------------------------------------
	Set u = oWshShell.Exec("mode.com con: lines=0")
	While u.Status = 0
		WScript.Sleep(10)
	Wend

 Wend