web-dev-qa-db-ja.com

`powercfg`はどこでバッテリーの状態情報を取得しますか?WMIにないのはなぜですか?

バッテリーを搭載したデバイスで実行されているWindows10(他のバージョンの中でも)では、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 battery report showing design capacity and full charge capacity

さらに、このラップトップの組み込み診断環境で起動すると、同様の数値とバッテリーの放電サイクル数が表示されます。

これらの値はどこから取得されますか?ラップトップのフリートについて、できればPowershellから、このバッテリー寿命データを経時的に追跡できるようにしたいと思います。脚本。このデータはWMIにあるはずであり、確かに、 Win32_Battery classDesignCapacityフィールドとFullChargeCapacityフィールドがありますが、私がテストしたすべてのシステムで、それらは未定義です:

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


DesignCapacity     :
FullChargeCapacity :

powercfgが行っているため、この情報にアクセスするためのプログラム的な方法が必要です。これを行うためのWMI、.NET、またはPowershellの方法がある場合は、それについて知りたいと思います。 powercfgレポートを生成して解析することもできますが、それを実行するための「正しい」方法がありそうな場合は、醜い回避策を実装したくありません。

7
tgies

MSBatteryスーパークラス を掘り下げる必要があるようです:

Root\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   : 

どうして? DesignedCapacityFullChargedCapacityおよびCycleCountにはいくつかの値があることがわかりますが、powercfg /batteryreportそれらを認識しません:

Battery stats

7
beatcracker