最终目标是更改PowerShell.exe的进程参数以将EnableRaisingEvents设置为$ true,以便在脚本终止时/我可以捕获退出事件。
我能找到的所有示例都是首先在新的流程对象上设置属性,然后使用start方法进行programmticaly生成,但我想知道是否可以修改现有流程来完成此操作? ...就像内联更新?
如果它可以在.NET中使用,那么很简单但如果我需要使用p / invoke下载到WinAPI,如果有人知道库/函数,我也可以解决这个问题。 THX。
答案 0 :(得分:3)
EnableRaisingEvents
是System.Diagnostics.Process
实例的属性,而不是实际的底层操作系统进程,无论底层进程是否已在运行,您都可以轻松修改它:
$process = Start-Process notepad -PassThru
# Change EnableRaisingEvents flag after process start
$process.EnableRaisingEvents = $true
# Now the Process instance can raise the Exited event
Register-ObjectEvent -InputObject $process -EventName Exited -SourceIdentifier notepadExited -Action {
Write-Host "Notepad exited" -ForegroundColor Red
}
$process.Kill()
如果您需要监控自己没有启动的已经运行的进程,可以使用Win32_ProcessStopTrace
WMI事件类:
# Using Start-Process for this example, but could be any existing process
$process = Start-Process notepad -PassThru
# Use the query to filter events raised based on process ID
$eventQuery = "SELECT ProcessName,ExitStatus FROM Win32_ProcessStopTrace WHERE ProcessId = $($process.Id)"
# Register WMI Event listener
Register-WmiEvent -Query $eventQuery -Action {
$traceEvent = $Event.SourceEventArgs.NewEvent
Write-Host "$($traceEvent.ProcessName) exited with status code: $($traceEvent.ExitStatus)"
} -SourceIdentifier notepadExited
$process.Kill()