如何在PowerShell中实现进程运行结束时触发退出事件?
PowerShell迁移实现方案
你可以根据是否需要在进程运行期间执行其他逻辑,选择以下两种实现方式:
方式1:同步等待进程退出(最简实现)
如果不需要异步执行其他任务,直接使用Start-Process的内置-Wait参数即可,无需手动处理进程事件:
# 替换为实际读取的ini配置值 $consolePath = "你的IQfact控制台程序根路径" $flowFolder = "ini中读取的IQFACT.flow_folder配置值" $workingDir = "ini中读取的IQFACT.Console_file配置值" $arg1 = "传入的业务参数" $exePath = Join-Path $consolePath "IQfactRun_Console.exe" $arguments = "-run " + (Join-Path $flowFolder $arg1) # 启动进程并等待执行完成后自动结束 Start-Process -FilePath $exePath ` -ArgumentList $arguments ` -WorkingDirectory $workingDir ` -WindowStyle Minimized ` -Wait # 此处写进程退出后需要执行的后续逻辑
方式2:异步绑定Exited事件(完全对齐原C#逻辑)
如果需要和原C#代码保持一致的异步事件处理逻辑,直接调用.NET的System.Diagnostics.Process类即可,参数和事件注册逻辑和C#完全对应:
# 脚本作用域变量,对应原C#的全局p和run_status $script:p = $null $script:run_status = $false function Execute-Process { param( [string]$console_path, [string]$arg1 ) try { # 读取ini配置,此处替换为你实际的ini读取逻辑 $flowFolder = "ini中读取的IQFACT.flow_folder值" $workingDir = "ini中读取的IQFACT.Console_file值" # 初始化进程对象 $script:p = New-Object System.Diagnostics.Process $script:p.StartInfo.FileName = Join-Path $console_path "IQfactRun_Console.exe" $script:p.StartInfo.Arguments = "-run " + (Join-Path $flowFolder $arg1) Write-Debug "arg: $($script:p.StartInfo.Arguments)" $script:p.StartInfo.CreateNoWindow = $false $script:p.StartInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized $script:p.StartInfo.UseShellExecute = $true $script:p.StartInfo.WorkingDirectory = $workingDir $script:p.StartInfo.RedirectStandardError = $false $script:p.StartInfo.RedirectStandardOutput = $false $script:p.StartInfo.RedirectStandardInput = $false # 注册Exited事件,对应原C#的Process_exited方法 Register-ObjectEvent -InputObject $script:p -EventName Exited -Action { # 此处替换为你原Process_exited方法中的业务逻辑 Write-Host "测量进程已退出,退出码:$($EventArgs.ExitCode)" $script:run_status = $false } | Out-Null $script:p.EnableRaisingEvents = $true $script:run_status = $true # 启动进程 $script:p.Start() | Out-Null } catch { Write-Debug "异常发生: $_" } }
注意事项
- 事件处理脚本块中如果需要访问外部作用域的变量,需要加
$script:或者$global:前缀指定作用域 - 进程对象需要存储在脚本/全局作用域,避免被PowerShell垃圾回收导致事件无法触发
内容的提问来源于stack exchange,提问作者DuyXike
相关产品推荐
相关产品推荐

