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

如何修改PowerShell中嵌入的C#代码以等待子进程终止

如何修改PowerShell中嵌入的C#代码以等待子进程终止

嘿,我之前留意到有位叫jborean93的大佬写了个实用的PowerShell脚本,运行后能生成一个叫noGui.exe的无窗口程序。如果你想修改里面嵌入的C#代码,让它能等待子进程终止后再退出,其实操作起来并不复杂,我给你一步步讲清楚:

首先先把原脚本的核心代码贴在这儿,方便你对照修改:

Add-Type -OutputType WindowsApplication -OutputAssembly NoGui.exe -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace NoGui
{
    class Program
    {
        [DllImport("kernel32.dll")]
        static extern bool AttachConsole(int dwProcessId);

        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                ProcessStartInfo psi = new ProcessStartInfo(args[0])
                {
                    Arguments = string.Join(" ", args, 1, args.Length - 1),
                    UseShellExecute = false
                };

                Process proc = Process.Start(psi);
                // 原代码此处没有等待子进程的逻辑
            }
        }
    }
}
'@

接下来就是关键的修改环节了:

  • 只需要在启动子进程的代码后面,加上等待进程终止的方法就行。用proc.WaitForExit()就可以,这个方法会让当前程序暂停,直到子进程完全退出后才继续执行。
  • 要是你担心子进程卡住导致程序一直等,还可以设置超时时间,比如最多等30秒,就换成proc.WaitForExit(30000)(参数单位是毫秒),到时间后不管子进程有没有结束,程序都会继续往下走。

同时建议你用using语句包裹Process对象,这样能自动释放进程相关的资源,避免出现资源泄漏的小问题。修改后的核心代码段长这样:

if (args.Length > 0)
{
    ProcessStartInfo psi = new ProcessStartInfo(args[0])
    {
        Arguments = string.Join(" ", args, 1, args.Length - 1),
        UseShellExecute = false
    };

    using (Process proc = Process.Start(psi))
    {
        // 无超时等待子进程终止
        proc.WaitForExit();

        // 如果需要设置30秒超时,就替换成下面这行
        // proc.WaitForExit(30000);
    }
}

把这段修改后的代码放回原来的PowerShell脚本里,重新运行脚本生成新的noGui.exe,这个程序就会乖乖等子进程跑完再退出啦~

备注:内容来源于stack exchange,提问作者arker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:04:40