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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:13:09