Где `powercfg` получает информацию о состоянии батареи и почему ее нет в WMI?

3417
tgies

На Windows 10 (среди других версий), работающей на устройстве с батареей, я могу использовать powercfg /batteryreportдля получения «Расчетную емкость» и «Последняя полная зарядная емкость» для батареи, которые дают представление об оставшемся полезном сроке службы батареи и насколько его мощность снизилась от использования.

C:\Users\superuser\AppData\Local\Temp>powercfg /batteryreport Battery life report saved to C:\Users\superuser\AppData\Local\Temp\battery-report.html 

HTML-отчет генерируется мгновенно и отображает, помимо прочего, интересующую меня статистику:

Отчет о батарее powercfg с указанием проектной емкости и полной зарядной емкости

Кроме того, я могу загрузить встроенную диагностическую среду этого ноутбука, и она отображает похожие цифры и количество циклов разрядки батареи.

Откуда эти значения получены? Я хотел бы иметь возможность отслеживать эти данные о времени автономной работы для парка ноутбуков, предпочтительно по сценарию Powershell. Казалось вероятным, что эти данные должны быть в WMI, и конечно же, есть класс Win32_Battery, имеющий DesignCapacityи FullChargeCapacityполе, но и на все системы я испытал, они не определены:

PS C:\Users\superuser> Get-WmiObject -Class Win32_Battery | Select-Object -Property *Capacity | Format-List   DesignCapacity : FullChargeCapacity : 

Должен быть какой-то программный способ доступа к этой информации, потому powercfgчто он делает это. Если для этого есть какой-нибудь способ WMI, .NET или Powershell, я бы хотел узнать об этом. Я мог бы сгенерировать powercfgотчет, а затем проанализировать его, но я действительно не хочу применять уродливый обходной путь, когда, скорее всего, существует «правильный» способ сделать это, который просто ускользает от меня.

6
хорошо, Windows может извлечь эту информацию из системного программного обеспечения (BIOS / UEFI) через ACPI: http://www.acpi.info/ https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface Frank Thomas 9 лет назад 0
+1 хороший вопрос. Я ненавижу, когда вещи не находятся в WMI или не упакованы PowerShell. David Betz 9 лет назад 0
Эта тенденция капитализации становится нелепой. ХИМИЯ ЛЬВА! beatcracker 9 лет назад 0
Ах, «ХИМИЯ» в отчетах HTML (черные ящики) гласит «ЛИОН», по-видимому, имея в виду литий-ионный. Мне потребовалось некоторое время, чтобы понять, что говорит комментарий @ beatcracker. TOOGAM 9 лет назад 0
@TOOGAM Итак, это только я, тогда :). Тем не менее, я хочу использовать RACOON CHEMISTRY в своем ноутбуке, чтобы он мог захватить любой источник питания, который мог найти. beatcracker 9 лет назад 0

1 ответ на вопрос

6
beatcracker

Похоже, вам нужно копаться в суперклассе MSBattery :

Несколько классов в корне \ wmi возвращают результаты более чем одного класса. Это звучит странно, но это можно объяснить на примере.

Пространство имен содержит ряд классов, связанных с батареей в ноутбуках

gwmi -Namespace root\wmi -List *battery*  MSBatteryClassEvent BatteryStatusChange BatteryTagChange  MSBatteryClass BatteryStaticData BatteryRuntime BatteryCycleCount  BatteryTemperature BatteryStatus BatteryFullChargedCapacity 

Мы пока проигнорируем событие и изменим классы. Если мы выберем класс MSBattery, мы получим информацию из ряда других возвращенных классов - MSBattery - это суперкласс.

PS> gwmi -Namespace root\wmi -Class MSBatteryClass | select __class  __CLASS ——- BatteryCycleCount BatteryFullChargedCapacity BatteryStaticData BatteryRuntime BatteryStatus 

Примеры такой работы на моем ноутбуке:

Get-WmiObject -Namespace 'root\wmi' -Query 'select DeviceName, ManufactureName, Chemistry, DesignedCapacity from BatteryStaticData'  __GENUS : 2 __CLASS : BatteryStaticData __SUPERCLASS :  __DYNASTY :  __RELPATH :  __PROPERTY_COUNT : 4 __DERIVATION : {} __SERVER :  __NAMESPACE :  __PATH :  Chemistry : 1852787020 DesignedCapacity : 48400 DeviceName : K52F-44 ManufactureName : ASUSTek PSComputerName :    Get-WmiObject -Namespace 'root\wmi' -Query 'select FullChargedCapacity from BatteryFullChargedCapacity'  __GENUS : 2 __CLASS : BatteryFullChargedCapacity __SUPERCLASS :  __DYNASTY :  __RELPATH :  __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER :  __NAMESPACE :  __PATH :  FullChargedCapacity : 47157 PSComputerName :    Get-WmiObject -Namespace 'root\wmi' -Query 'select CycleCount from BatteryCycleCount'  __GENUS : 2 __CLASS : BatteryCycleCount __SUPERCLASS :  __DYNASTY :  __RELPATH :  __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER :  __NAMESPACE :  __PATH :  CycleCount : 0 PSComputerName :  

Почему вроде? Потому что в то время как вы можете видеть, что DesignedCapacity, FullChargedCapacityи CycleCountесть несколько значений, powercfg /batteryreportоленья кожа recoginze их:

Battery stats