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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 20:12:02