VSCode中Node.js无法直接调用系统电池API,需跨平台适配:Windows用PowerShell调WMI获取电量,macOS需提前授权pmset并解析输出,Linux则读取/sys/class/power_supply下对应设备的capacity文件。

VSCode 里装 Node 不等于能调用系统电池 API
Node.js 本身不提供跨平台获取电池电量的 API,process.platform 能告诉你当前是 Windows、macOS 还是 Linux,但没内置 getBatteryLevel() 这种函数。你得靠第三方模块或原生命令桥接——直接写 require('os') 或 require('fs') 是拿不到电量的。
Windows 下用 powercfg 命令快速提取剩余电量
最轻量、无需额外 npm 包的方法:调用系统自带命令。Windows 的 powercfg /batteryreport 会生成 HTML 报告,但实时读取更推荐 powercfg /query 或 PowerShell 脚本。
-
powercfg /batteryreport /output "battery.html"生成报告后需解析 HTML,延迟高、路径权限易出错 - 更稳的做法是用 PowerShell 一行获取:
Get-WmiObject -Class Win32_Battery | Select-Object EstimatedChargeRemaining - 在 Node 中用
child_process.exec调用时,注意加{ shell: 'powershell.exe' },否则默认 cmd 不识别Get-WmiObject - PowerShell 输出含换行和空格,建议用
.trim()和正则提取数字,比如match(/(\d+)/)?.[1]
macOS 下读取 pmset 输出需绕过权限提示
pmset -g batt 是 macOS 获取电池状态的唯一可靠命令,但它在某些版本(如 Ventura+)首次运行时会弹窗要求“自动化”权限,导致 Node 子进程卡住或返回空字符串。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 必须提前手动执行一次
pmset -g batt并同意权限,否则脚本静默失败 - 输出格式不稳定:有 “;” 分隔的键值对,也有 “-” 开头的注释行,需过滤掉非数据行
- 关键字段是
InternalBattery-0行里的##%;模式,可用正则/\d+%;/g提取再切掉分号 - 不要依赖
system_profiler SPPowerDataType,它不实时,且需要管理员权限
Linux 下查 /sys/class/power_supply/ 文件要判断电源类型
Linux 没统一命令,靠读取 sysfs。但不同设备路径可能为 BAT0、axp288_fuel_gauge 或 hid-battery,且 AC 在线时 capacity 文件可能不存在。
- 先用
fs.readdirSync('/sys/class/power_supply')列出所有供电设备目录 - 逐个检查子目录下是否有
capacity和status文件;跳过AC类目录(含online文件) - 读
capacity前先fs.accessSync(..., fs.constants.R_OK),避免 EACCES 错误 - 有些设备(如部分 ARM 笔记本)只暴露
energy_now/energy_full,需计算百分比:Math.round((now / full) * 100)
跨平台封装时别硬写 if-else 大杂烩,优先检测命令是否存在再 fallback 到文件读取;电量不是高频指标,没必要用 setInterval 每秒轮询,30 秒以上间隔更稳妥。真正容易被忽略的是:macOS 权限弹窗不会出现在 VSCode 终端里,它挂在 Dock 上,你得去点——否则脚本就停那儿了。

















