PowerShell可通过监听Windows事件日志中网络相关事件(如Netman ID 4001、Dhcp-Client ID 1002等)创建事件触发任务来响应网络状态变化,需先验证实际环境中的日志路径与事件ID,再用New-ScheduledTaskTrigger -Event配置,并注意权限、执行策略及电源设置。
powershell 本身不提供“网络状态改变”这一原生触发器类型,但可以通过监听 windows 事件日志中与网络连接/断开相关的事件(如事件 id 10000、4001、1001 等),结合 new-scheduledtasktrigger -event 创建事件驱动型计划任务,实现对网络状态变化的响应。
关键不是“检测网络”,而是“捕获系统记录的网络事件”——Windows 网络堆栈在连接建立或中断时,会向事件日志写入标准条目,任务计划程序可精准监听这些条目。
H3:确认目标网络事件 ID 和日志路径
不同网络组件记录事件的位置不同,需先验证实际环境中的有效事件:
-
常见断网事件
- 日志:
System- 来源:
Netman,事件 ID4001(网络连接已断开) - 来源:
Dhcp-Client,事件 ID1001(DHCP 获取地址失败)
- 来源:
- 日志:
Applications and Services Logs → Microsoft → Windows → WLAN-AutoConfig → Operational- 事件 ID
10000(WLAN 连接断开)
- 事件 ID
- 日志:
✅ 操作建议:
打开事件查看器(eventvwr.msc),手动断开/重连一次 Wi-Fi 或以太网,观察上述日志中是否出现对应事件。记下确切的日志路径、来源名称、事件 ID——这是后续配置的唯一依据。
H3:用 PowerShell 创建事件触发的任务
以监听“系统日志中 Netman 的事件 ID 4001(断网)”为例:
# 定义触发器:监听 System 日志中 Netman 发出的 4001 事件
$trigger = New-ScheduledTaskTrigger -Event -LogName "System" -Source "Netman" -Id 4001
# 定义操作:例如运行一个断网处理脚本
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\on_disconnect.ps1" `
-WorkingDirectory "C:\Scripts"
# 设置主体(必须指定用户,否则可能无权限读取网络状态或执行操作)
$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -LogonType Interactive
# 设置任务选项:允许电池模式运行、失败后重试
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopOnIdleEnd `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 1)
# 注册任务
Register-ScheduledTask -TaskName "NetworkDownHandler" `
-Trigger $trigger `
-Action $action `
-Principal $principal `
-Settings $settings `
-Description "在检测到网络断开时执行断网响应脚本"⚠️ 注意:若脚本需管理员权限(如调用
shutdown.exe或修改网络适配器),必须加-RunLevel Highest到New-ScheduledTaskPrincipal,并确保运行注册命令时以管理员身份启动 PowerShell。
H3:进阶技巧——区分“断网”与“连网”并分别响应
Windows 不直接记录“连网成功”事件,但可通过以下方式补全:
-
连网可用事件替代方案:
- 监听
WLAN-AutoConfig日志中事件 ID10001(连接成功) - 或监听
Dhcp-Client中事件 ID1002(成功获取 IP) - 或使用
Win32_NetworkAdapterConfigurationWMI 查询,但需配合轮询(不推荐用于纯事件触发)
- 监听
✅ 推荐做法:为“连网”和“断网”分别创建两个独立任务,共用同一脚本但传入不同参数:
# 断网任务:传参 -State Down
$downAction = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-File C:\Scripts\network_event.ps1 -State Down"
# 连网任务:监听事件 ID 1002(Dhcp-Client)
$upTrigger = New-ScheduledTaskTrigger -Event -LogName "System" -Source "Dhcp-Client" -Id 1002
$upAction = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-File C:\Scripts\network_event.ps1 -State Up"脚本内即可根据 $State 执行不同逻辑(如断网关机、连网启动热点等)。
H3:验证与排错要点
- 任务不会在事件发生前预加载,首次触发需等待真实事件;可手动在事件查看器中右键“事件”→“附加任务到此事件”快速测试。
- 若任务未触发,请检查:
- 事件日志服务(
EventLog)是否正在运行 - 任务是否启用(
Get-ScheduledTask "NetworkDownHandler" | Select State) - 用户凭据是否正确,尤其跨用户或系统账户时
- 脚本路径是否存在、权限是否允许执行(
.ps1需策略支持或加-ExecutionPolicy Bypass) - 是否勾选了“只有在交流电源下运行”(笔记本用户务必禁用该限制)
- 事件日志服务(
不复杂但容易忽略


















