Onde o 'powercfg' obtém informações de integridade da bateria e por que não está no WMI?

6

No Windows 10 (entre outras versões) em execução em um dispositivo com bateria, posso usar powercfg /batteryreport para obter a "Capacidade de design" e a "Última capacidade de carga total" da bateria, o que dá uma ideia do restante vida útil útil da bateria e quanto sua capacidade se degradou devido ao uso.

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

O relatório HTML é gerado instantaneamente e exibe, entre outras, as estatísticas que me interessam:

Alémdisso,possoinicializarnoambientedediagnósticointegradodestelaptopeeleexibenúmerossemelhanteseacontagemdociclodedescargadabateria.

Deondeessesvaloresestãosendoobtidos?Eugostariadepoderrastrearessesdadosdevidaútildabateriaaolongodotempoparaumafrotadelaptops,depreferênciadeumscriptPowershell.PareceprovávelqueessesdadosestejamnoWMIe,comcerteza,háum A classe Win32_Battery possui campos DesignCapacity e FullChargeCapacity , mas em todos os sistemas que testei, eles são indefinidos:

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


DesignCapacity     :
FullChargeCapacity :

Deve haver alguma maneira programática de acessar essas informações, porque powercfg está fazendo isso. Se houver algum jeito WMI, .NET ou Powershell de fazer isso, eu gostaria de saber sobre isso. Eu poderia gerar o relatório powercfg e depois analisá-lo, mas eu realmente não quero implementar uma solução feia quando há uma maneira "certa" de fazê-lo que está apenas escapando de mim.

    
por tgies 31.10.2015 / 04:33

1 resposta

6

Parece que você precisa entrar na superclasse do MSBattery :

A number of the classes in root\wmi return results from more than one class. That sounds odd but it can be explained by an example.

The namespace contains a number of classes related to the battery in laptops

gwmi -Namespace root\wmi -List *battery*

MSBatteryClassEvent
BatteryStatusChange
BatteryTagChange 
MSBatteryClass
BatteryStaticData
BatteryRuntime
BatteryCycleCount 
BatteryTemperature
BatteryStatus
BatteryFullChargedCapacity

We’ll ignore the event and change classes for now. If we pick out the MSBattery class we get information from a number of other classes returned – MSBattery is a super class.

PS> gwmi -Namespace root\wmi -Class MSBatteryClass | select __class

__CLASS  ——-
BatteryCycleCount
BatteryFullChargedCapacity
BatteryStaticData
BatteryRuntime BatteryStatus

Exemplos, esse tipo de trabalho no meu laptop:

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   : 

Por que tipo de? Porque, embora você possa ver que DesignedCapacity , FullChargedCapacity e CycleCount possuem alguns valores, powercfg /batteryreport não os reconhece:

    
por 02.11.2015 / 17:55