如何在PowerShell中通过事件等待系统级可执行程序启动后执行代码?
监控进程启动的基于事件的PowerShell方案
你之前用Wait-Event -SourceIdentifier "ProcessStarted"无效,是因为没有预先注册对应的事件源——PowerShell不会自动监听系统进程启动事件,必须先通过CIM/WMI事件订阅来创建这个事件源,Wait-Event才能捕获到触发信号。
下面是两种实用的实现方式:
一、自动触发代码(推荐:事件触发时直接执行逻辑)
这种方式会在进程启动时自动运行你指定的代码,无需手动等待,适合持续监控场景。
监控任意进程启动
# 注册系统进程启动的CIM事件订阅 Register-CimIndicationEvent -ClassName Win32_ProcessStartTrace -SourceIdentifier "ProcessStarted" -Action { # 从事件参数中提取进程信息 $newProcess = $EventArgs.NewEvent # 这里替换成你要执行的代码 Write-Host "[$(Get-Date -Format 'HH:mm:ss')] 新进程启动:ID=$($newProcess.ProcessId),名称=$($newProcess.ProcessName),路径=$($newProcess.ExecutablePath)" }
监控特定进程(比如notepad.exe)
只需添加过滤条件即可:
Register-CimIndicationEvent -ClassName Win32_ProcessStartTrace -SourceIdentifier "NotepadStarted" -Filter "ProcessName='notepad.exe'" -Action { $newProcess = $EventArgs.NewEvent Write-Host "[$(Get-Date -Format 'HH:mm:ss')] 记事本已启动:ID=$($newProcess.ProcessId),路径=$($newProcess.ExecutablePath)" # 执行你的自定义业务逻辑 }
停止监控
当不需要继续监听时,取消事件订阅:
# 对应任意进程的订阅 Unregister-Event -SourceIdentifier "ProcessStarted" # 对应特定进程的订阅 Unregister-Event -SourceIdentifier "NotepadStarted"
二、手动等待事件触发
如果你希望代码暂停直到进程启动,再执行后续逻辑,可以用这种方式:
# 先注册事件源 Register-CimIndicationEvent -ClassName Win32_ProcessStartTrace -SourceIdentifier "ProcessStarted" # 暂停代码,等待第一个进程启动事件 $event = Wait-Event -SourceIdentifier "ProcessStarted" # 处理捕获到的事件 $newProcess = $event.SourceEventArgs.NewEvent Write-Host "捕获到进程启动:$($newProcess.ProcessName)(ID:$($newProcess.ProcessId))" # 清理事件资源 Remove-Event -SourceIdentifier "ProcessStarted" Unregister-Event -SourceIdentifier "ProcessStarted"
注意事项
- 事件订阅是PowerShell会话级的,关闭当前PowerShell窗口后订阅会失效;如果需要持久化监控,可以结合Windows任务计划,让PowerShell脚本开机自启并保持运行。
Win32_ProcessStartTrace是系统内置的WMI类,能可靠捕获所有进程启动事件,包括后台进程。
内容的提问来源于stack exchange,提问作者Digitality
相关产品推荐
相关产品推荐

