Centrum Skrypciarzy - Systemy Operacyjne

Jak stwierdzić, czy laptop jest zasilany z baterii?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak stwierdzić, czy laptop jest zasilany z baterii?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak stwierdzić, czy laptop jest zasilany z baterii?

-- TJ

Cześć Skrypciarze! Odpowiedź

Cześć, TJ. No tak, baterie. W zeszłym roku, w środku zimy, w domu Skrypciarza piszącego te słowa przez sześć dni nie było prądu. A czy Skrypciarz piszący te słowa się tym przejął? Oczywiście, że nie. Przecież był na to przygotowany: miał cztery (właśnie: cztery) latarki, każda z zestawem baterii. Nie było także ogrzewania w domu i po pierwszym dniu trzeba było wyrzucić jedzenie, a przynajmniej to, co było w lodówce. Ale były za to latarki, wszystkie z bateriami.

Ale piszący te słowa Skrypciarz nie był przygotowany na jedną rzecz. Mianowicie na to, że baterie się z czasem rozładowują. (Skąd miał to wiedzieć?!) Drugiego dnia dwie latarki przestały świecić, a niedługo potem, pozostałe dwie znacznie osłabły. W tym momencie nasz Skrypciarz usiadł na podłodze. Wyjął wszystkie baterie i zaczął je mieszać w nadziei, że znajdzie jakąś kombinację pozwalającą odpalić przynajmniej jedną z latarek.

Oczywiście piszący te słowa Skrypciarz wpadł na pomysł, żeby pójść do sklepu i nabyć nowe baterie, ale szybko przekonał się, że wszystkie baterie (dosłownie wszystkie) zostały wykupione na długo przedtem, zanim on sam o tym pomyślał.

W każdym razie, próba znalezienia kombinacji mogącej sprawić, że latarka będzie znowu świecić, była bardzo interesującym ćwiczeniem, podobnym do zadanego przez TJ pytania: jak określić, czy laptop jest zasilany z baterii. Jak się okazuje, jest milion klas WMI w przestrzeni nazw cimv2, które mogłyby przekazać informację o bateriach, jednak nie można na nich do końca polegać. Przykładowo, na komputerze testowym Skrypciarzy, klasa Win32_PortableBattery nie przekazała żadnej informacji. Z kolei klasa Win32_Battery przekazała informację… ale jakąś dziwną. Innym razem, klasy BatteryStatus i Availability na przemian przekazywały dwie wartości: Unknown i Other.

Uwaga. Jaka jest różnica pomiędzy Unknown (nieznane) a Other (inne)? Dobre pytanie. O ile się nie mylimy, Unknown oznacza „Nie mamy pojęcia, jaki jest status baterii”. Natomiast Other znaczy „Wiemy, jaki jest status baterii, ale wam nie powiemy”. Tak czy siak, żadna informacja nie była specjalnie przydatna.

W tym momencie Skrypciarz piszący te słowa rozpoczął przeszukiwanie przestrzeni nazw root\wmi. Przeszukiwanie tej przestrzeni nazw to jak buszowanie w sklepie z używaną odzieżą: większość znalezionych rzeczy do niczego się nie nadaje. (Większość klas zachowanych w klasie root\wmi jest ważna, ale nie przekazują one żadnych informacji.) Od czasu do czasu jednak można natknąć się na coś przydatnego; w przestrzeni nazw root\wmi może to być klasa BatteryStatus:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")



Set colItems = objWMIService.ExecQuery("Select * From BatteryStatus Where Voltage > 0")



For Each objItem in colItems

    Wscript.Echo "Battery: " & objItem.InstanceName

    Wscript.Echo "On AC Power: " & objItem.PowerOnline

    Wscript.Echo "Battery is Discharging: " & objItem.Discharging

    Wscript.Echo "Battery is Charging: " & objItem.Charging

    Wscript.Echo "Remaining capacity: " & objItem.RemainingCapacity

Next

Jeszcze jedna sprawa, zanim przejdziemy do omawiania skryptu. O ile wiemy, właśnie ta klasa nigdy nie została opisana; szukaliśmy wszędzie informacji o klasie BatteryStatus i prawie nic nie znaleźliśmy. Jednak według naszej wiedzy, skrypt działa bez zarzutu na laptopach z zainstalowanym oprogramowaniem Windows XP oraz Windows Vista, co przy odrobinie szczęścia będzie pomocne.

Uwaga. Czy skrypt działa także w innych wersjach systemu Windows? Prawdę mówiąc, nie wiemy, a to dlatego, że nie mamy laptopów z Windows 2000 ani z Windows Server 2003.

Jeżeli chodzi o sam skrypt, zaczynamy od połączenia z usługą WMI na lokalnym komputerze. Na szczęście, skrypt działa także na komputerach zdalnych; w sumie – jeżeli chcemy sprawdzić, czy lokalny komputer jest zasilany z baterii, łatwiej i prościej byłoby rzucić okiem na ścianę i zobaczyć, czy kabel zasilający jest podłączony do gniazdka. Zatem jak zmodyfikować ten skrypt, aby działał w przypadku zdalnych komputerów? To proste; przypisujemy nazwę zdalnego komputera (np. atl-ws-01) do zmiennej o nazwie strComputer:

strComputer = "atl-ws-01"

Po utworzeniu połączenia (zauważmy, że łączymy się z przestrzenią nazw root\wmi) używamy poniższego wiersza kodu w celu uzyskania informacji o wszystkich bateriach o napięciu Voltage większym niż 0:

Set colItems = objWMIService.ExecQuery("Select * From BatteryStatus Where Voltage > 0")

Do czego jest nam potrzebne zastrzeżenie o napięciu większym od 0? No cóż, prawdę mówiąc, nie wiemy, czy jest to wymagana informacja. W naszym wypadku, komputer testowy Skrypciarzy ma dwie oddzielne gniazda baterii, ale tylko w jednym z nich znajduje się bateria. Niemniej, pusta komora także traktowana jest jak bateria, tyle że ma ona napięcie 0. Wydane nam się to trochę głupie, dlatego też dodaliśmy zdanie zaczynające się od Where w celu odfiltrowania nieistniejących baterii.

Uwaga. Owszem, podczas próby ustalenia, które baterie z latarek nadają się jeszcze do zastosowania, Skrypciarz piszący te słowa powinien zrobić coś podobnego i najpierw odrzucić te, które na pewno się już nie nadają. Na pewno nie powinien odkładać przetestowanej baterii z powrotem do puli, z której ją wziął, mieszając z bateriami, które nie zostały jeszcze przetestowane. Co zatem zrobił? No cóż, to było dawno temu i trudno sobie przypomnieć, co on wtedy zrobił, a czego nie ….

Po wykonaniu naszego zapytania uruchamiamy pętlę For Each, która pobierze informacje o każdej baterii z kolekcji. Wybieramy wywołanie echa wartości następujących właściwości:

  • InstanceName. Identyfikator baterii.
  • PowerOnline. Klucz do całego skryptu. Jeżeli właściwość PowerOnline ma wartość True, oznacza to, że rozgałęźnik prądu zmiennego jest włączony do gniazdka i komputer nie jest zasilany z baterii.
  • Discharging. Wskazuje, czy bateria jest używana, tzn. czy się rozładowuje .
  • Charging. Wskazuje, czy bateria jest aktualnie ładowana.
  • RemainingCapacity. Informuje o szacowanej pozostałej mocy baterii. Nie jesteśmy całkiem pewni, co ta liczba oznacza. Znaleźliśmy gdzieś informację, że ta wartość jest przekazywana w miliwatogodzinach, ale nie mamy co do tego pewności, nie wiemy nawet, co to jest miliwatogodzina. Jednak wiemy, że na naszym komputerze testowym miernik poziomu mocy systemu Windows pokazywał szacowany czas życia baterii równy 2 godz. 54 min. (czyli 174 minuty). Tymczasem wartość właściwości RemainingCapacity wynosiła 43734. Jeżeli podzielimy 43734 przez 174 minuty, otrzymamy wartość 252. Wydaje się, że to liczba magiczna: za każdym razem, gdy dzielimy RemainingCapacity przez 252, otrzymujemy wartość w minutach odpowiadającą szacowanemu czasowi życia baterii, podawanemu przez miernik systemowy. Nie możemy wprawdzie zagwarantować, że 252 to na pewno ta magiczna liczba, ale jak na początek, to jest coś.

Co się dzieje, kiedy odłączymy komputer testowy (powodując, że będzie zasilany z baterii), a następnie odpalimy skrypt? Otrzymamy informację podobną do następującej:

Battery: ACPI\PNP0C0A\1_0

On AC Power: False

Battery is Discharging: True

Battery is Charging: False

Remaining capacity: 41769

Z kolei jeżeli ponownie podłączymy komputer i uruchomimy skrypt, otrzymamy co następuje:

Battery: ACPI\PNP0C0A\1_0

On AC Power: True

Battery is Discharging: False

Battery is Charging: True

Remaining capacity: 42273

Innymi słowy, w przeciwieństwie do latarek piszącego te słowa Skrypciarza, skrypt wydaje się działać bez zarzutu.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Systemy Operacyjne