如何修改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
相关产品推荐
相关产品推荐

