Triki z PowerShellem #15 – Puff, jak gorąco!

2010-07-13 23:03

Obecne temperatury są uciążliwe nie tylko dla nas – organizmów opartych o białka i węgiel, ale też dla naszych półprzewodnikowych, krzemowych gadżetów. Dotyczy to również komputerów oraz ich procesorów. Jak każde układy scalone, mają one tendencję do nagrzewania się – czasem nadmiernego. Dlatego dobrze jest monitorować temperaturę procesora.
Istnieje oczywiście wiele gotowych aplikacji, które na to pozwalają, ale przecież zawsze fajniej jest zakodować coś samemu, nieprawdaż? :) A już zupełnie świetnie jest wtedy, gdy użyjemy do tego naszego ulubionego narzędzia do administrowania systemem, czyli PowerShella.

Przy jego pomocy pobranie aktualnej temperatury procesora nie jest trudne. Posługujemy się do tego WMI – Windows Management Instrumentation – które to jest rozszerzeniem modelu sterowników systemu Windows, pozwalającym m.in. na monitorowanie różnego rodzaju informacji diagnostycznych. PowerShell zawiera wbudowane komendy, pozwalające na tworzenie obiektów WMI – wśród nich również takich, które udostępniają informacje na temat temperatury procesora:

  1. # cpu-temp.ps1
  2. # Pokazywanie temperatury procesora
  3.  
  4. $tzt = Get-WmiObject -Class "MSAcpi_ThermalZoneTemperature"
  5.     -Namespace "root\WMI" -ErrorAction SilentlyContinue
  6. if ($tzt -ne $null)
  7. {
  8.     $rawTemp = $tzt.CurrentTemperature
  9.     $tempC = ($rawTemp - 2732) / 10
  10.     "Temp. procesora: " + $tempC.ToString() + " st. C" | Out-Host
  11. }
  12. else { "Pomiar temperatury niemożliwy." | Out-Host }

Z bliżej nieokreślonych powodów wartość temperatury podawana jest w dziesiątych częściach kelwinów, więc konieczne jest ich przeliczenie na stopnie Celsjusza. Ponadto istnieje też prawdopodobieństwo, że używana tutaj klasa WMI o nazwie MSAcpi_ThermalZoneTemperature nie jest dostępna na naszym komputerze – zależy to prawdopodobnie od modelu jego płyty głównej. W moim przypadku powyższy kod działał bez problemu na komputerze stacjonarnym, lecz nie na laptopie. Może to i dobrze… Mam bowiem uzasadnione przeczucie, że temperatura tamtejszego procesora wcale by mi się nie spodobała ;)

Be Sociable, Share!
Be Sociable, Share!
Tags: , , ,
Author: Xion, posted under Programming »


8 comments for post “Triki z PowerShellem #15 – Puff, jak gorąco!”.
  1. joaef:
    July 14th, 2010 o 0:26

    jest:Obecne temperatury są uciążliwe nie tylko dla nas – organizmów opartych o białka i węgiel, ale też dla naszych półprzewodnikowych, krzemowych gadżetów.

    powinno być:Obecne temperatury są uciążliwe nie tylko dla nas – organizmów opartych o białka i węgiel, ale też dla naszych półprzewodnikowych, krzemowych braci.

  2. TeMPOraL:
    July 14th, 2010 o 7:12

    Z bliżej nieokreślonych powodów wartość temperatury podawana jest w dziesiątych częściach kelwinów (…)
    Hmm, może to dlatego, żeby całość “wcisnąć” do unsigned int’a? Stopnie Celsjusza są jednostką pochodną (co rodzi pytanie, dlaczego w ogóle jej używamy?); przejście na kelwiny uwalnia nas od ujemnych wartości. A dziesiąte części stopnia związane są pewnie z dokładnością pomiaru, jaką chce nam pokazać WMI.

    That’s my guess, at least.

  3. SirMike:
    July 14th, 2010 o 8:42

    A na mojej stacjonarce nie dziala :P Ale nie chce mi sie sprawdzac dlaczego.

  4. SebaS86:
    July 14th, 2010 o 9:00

    A białka nie zawierają węgla? :P

  5. vashpan:
    July 14th, 2010 o 9:33

    Pod PowerShellem z Windows 7 jest jakis blad parsowania czy inne cholerstwo ;)


    Missing expression after unary operator '-'.
    At C:\Users\XXX\Desktop\cpu_temp.ps1:4 char:6
    + - <<<< Namespace "root\WMI" -ErrorAction SilentlyContinue
    + CategoryInfo : ParserError: (-:String) [], ParseException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

  6. Xion:
    July 14th, 2010 o 11:10

    @vashpan: Linijka z wywołaniem Get-WmiObject jest złamana tylko po to, żeby nie wystawała na pasek boczny na stronie :) W rzeczywistym skrypcie powinien być to tylko jeden wiersz.

    @TeMPOraL: Że to są kelwiny, to niedziwne, ale zaskakujące są te 1/10. Przecież IEEE to uniwersalny standard liczb zmiennoprzecinkowych, więc nie widzę powodu, by nie używać tutaj floatów :)

  7. Fredny:
    July 14th, 2010 o 14:52

    A to akurat nie dziwne – po to żeby nie ośmieszać się nieznaczącymi cyframi w n-tym miejscu po przecinku, oraz, większość czujników przekazuje temperaturę liczba 12to bitową, w zakresie od -128 do 127*C , z dokładnością 1/16 stopnia (0.0625), co po zaokrągleniu da 0.1 :D

  8. Asmodeusz:
    July 14th, 2010 o 14:57

    Znalazłem przyczynę ‘niedziałania’ – na Win7 (x86 Home Premium) potrzebne są uprawienia administratora do odczytu temperatury.

    @Xion: liczby zmiennoprzecinkowe są niby standardem, jednak standardem przekazywania wartości w Windows API jest (zwykle) DWORD. Wszelkie FLOATy są używane tak rzadko, jak to możliwe – stąd może taki wybór jednostki?

Comments are disabled.
 


© 2023 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.