You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:30:46