使用PowerShell检测电池状态并实现断电通知故障排查
解决PowerShell检测电源状态并触发通知的问题
原代码存在的问题
- 递归调用会引发栈溢出:PowerShell的递归深度有限,长时间运行后程序会崩溃
- 使用了已过时的
Get-WmiObject:PowerShell官方推荐用Get-CimInstance替代该命令 - 未监听状态变化逻辑:仅在当前为AC供电时递归,但状态切换后的持续监听机制存在缺陷
- 未考虑多电池场景:可能无法准确获取设备的实际供电状态
改进后的代码
用while循环替代递归,实现持续监听,仅在电源从AC切换到电池时触发通知:
# 首次运行需先安装BurntToast模块,取消注释下方命令执行 # Install-Module -Name BurntToast -Scope CurrentUser -Force Function Test-PowerState { $previousState = "AC" # 初始状态设为AC供电 while ($true) { # 获取电源状态(采用更现代的CIM命令) $powerStatus = Get-CimInstance -ClassName Win32_Battery $isOnAC = $powerStatus.BatteryStatus -eq 2 if ($isOnAC) { Write-Host "当前使用AC电源供电" $currentState = "AC" } else { Write-Host "当前使用电池供电" $currentState = "Battery" } # 仅在状态从AC切换为电池时发送通知,避免重复弹窗 if ($previousState -eq "AC" -and $currentState -eq "Battery") { New-BurntToastNotification -Text "电源状态通知", "已切换为电池供电!" } $previousState = $currentState Start-Sleep -Seconds 5 } } # 启动状态监听 Test-PowerState
代码说明
- 用
while ($true)实现无限循环,彻底避免递归导致的栈溢出问题 - 采用
Get-CimInstance替代旧的Get-WmiObject,符合PowerShell的现代规范 - 记录
previousState变量,仅在供电状态发生切换时触发通知,避免重复推送 - 每次循环都会更新当前状态,确保检测结果实时准确
注意事项
- 首次运行需安装
BurntToast模块,取消注释代码中的安装命令即可完成安装 - 无需管理员权限,普通用户权限即可正常运行
- 若设备为多电池配置,可调整代码遍历所有电池状态,确保检测结果准确
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

