如何在设备电池剩余30%时自动触发PowerShell脚本发送邮件?
实现电池电量触发PowerShell脚本的自动执行方案
下面提供两种可靠的自动触发方式,配合你的电池检测需求:
方法一:Windows任务计划程序(推荐,可视化配置)
这是最稳定的系统级触发方案,无需保持PowerShell会话:
- 打开任务计划程序,点击「创建任务」(功能比「创建基本任务」更完整),命名为「Battery Low Alert」
- 切换到「触发器」选项卡,点击「新建」:
- 触发器类型选择「WMI事件」
- 在「查询」框输入WQL语句:
说明:SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_Battery' AND TargetInstance.EstimatedChargeRemaining <= 30 AND TargetInstance.BatteryStatus = 1WITHIN 60表示每分钟检测一次状态变化;BatteryStatus = 1对应电池放电模式(即设备用电池供电)
- 切换到「操作」选项卡,点击「新建」:
- 操作类型选择「启动程序」
- 程序/脚本填
powershell.exe - 添加参数:
-ExecutionPolicy Bypass -File "C:\你的脚本路径\BatteryAlert.ps1"(替换为实际脚本路径)
- 切换到「条件」选项卡:
- 取消勾选「只有在计算机使用交流电源时才启动此任务」
- 勾选「只有在计算机使用电池电源时才启动此任务」(双重保障,避免误触发)
- 切换到「设置」选项卡,按需勾选「如果任务失败,每隔5分钟重试」「允许任务按需运行」等选项,最后保存。
方法二:注册WMI事件订阅(后台实时监控)
适合轻量后台运行场景,用PowerShell直接注册系统事件:
创建监控脚本(比如BatteryMonitor.ps1):
# 定义WMI事件查询,监控电池状态变化 $query = @" SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_Battery' AND TargetInstance.EstimatedChargeRemaining <= 30 AND TargetInstance.BatteryStatus = 1 "@ # 定义触发后的动作:发送邮件 $action = { $computerName = $env:COMPUTERNAME # 替换为你的SMTP配置 $smtpConfig = @{ SmtpServer = "smtp.yourdomain.com" Port = 587 From = "battery-alert@yourdomain.com" To = "your-notify@email.com" Subject = "[$computerName] 电池电量已降至30%" Body = "设备 $computerName 当前处于电池模式,剩余电量不足30%,请及时充电。" UseSsl = $true Credential = Import-Clixml -Path "C:\Creds\SmtpCreds.xml" } Send-MailMessage @smtpConfig # 避免1小时内重复发送 $lastAlertFile = "C:\Temp\LastBatteryAlert.txt" if (-not (Test-Path $lastAlertFile)) { New-Item $lastAlertFile -Force | Out-Null } $lastAlertTime = Get-Content $lastAlertFile | Get-Date if ((Get-Date) - $lastAlertTime -lt (New-TimeSpan -Hours 1)) { return } Get-Date | Out-File $lastAlertFile -Force } # 注册事件订阅 Register-WmiEvent -Query $query -Action $action -SourceIdentifier "BatteryLowMonitor" Write-Host "电池监控已启动,按Ctrl+C停止..." # 保持会话运行 do { Start-Sleep 30 } while ($true)
使用说明:
- 运行脚本后,PowerShell会话会保持后台监控,关闭会话则停止监控
- 要开机自动运行,可将脚本添加到「启动」文件夹,或用任务计划设置开机启动该脚本
- 取消监控:执行
Unregister-Event -SourceIdentifier "BatteryLowMonitor"
额外优化建议
- 替换
Get-WmiObject为Get-CimInstance Win32_Battery,CIM是WMI的更新版本,兼容性和性能更好 - 邮件凭据可提前加密存储,避免手动输入:
Get-Credential | Export-Clixml -Path "C:\Creds\SmtpCreds.xml"
内容的提问来源于stack exchange,提问作者Jorge Romero
相关产品推荐
相关产品推荐

