C#启动命令行实用程序时如何正确向目标程序传递参数
问题根因
当前代码中传入PowerShell的参数用;作为命令分隔符,执行逻辑为顺序同步执行:
- 首先切换到
C:\inetpub\letsencrypt目录 - 启动
wacs.exe,并阻塞等待wacs.exe进程完全退出 - wacs进程退出后,PowerShell才会执行后面的
N语句,此时wacs进程已经销毁,自然无法收到该参数
参数传递方向的判断是准确的:N从未进入win-acme的进程上下文,只是PowerShell进程中排在wacs启动命令后的一条无效语句。
推荐方案(稳定性最高)
不需要嵌套启动PowerShell,win-acme原生支持完整的非交互式命令行参数,直接启动wacs.exe并传入对应官方参数即可,不需要走交互菜单输入N,兼容性远高于模拟交互输入:
Process wacsProcess = Process.Start(new ProcessStartInfo { FileName = @"C:\inetpub\letsencrypt\wacs.exe", // 此处填入业务需要的win-acme命令行参数,对应原本输入N要触发的操作 // 所有支持的参数可参考win-acme自带的帮助说明,所有菜单操作都有对应的参数可以直接调用 Arguments = @"", WorkingDirectory = @"C:\inetpub\letsencrypt", RedirectStandardOutput = true, UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden }); wacsProcess.WaitForExit(); string output = wacsProcess.StandardOutput.ReadToEnd(); File.WriteAllText(@".\OutPutAfterFirstLaunch.txt", output);
备选方案(仅适用于必须走交互流程的场景)
如果因特殊限制必须模拟交互输入N,需要开启进程的标准输入重定向,直接向win-acme的输入流写入内容,不要把输入内容拼接在PowerShell命令序列中:
Process wacsProcess = Process.Start(new ProcessStartInfo { FileName = @"C:\inetpub\letsencrypt\wacs.exe", WorkingDirectory = @"C:\inetpub\letsencrypt", RedirectStandardOutput = true, RedirectStandardInput = true, // 必须开启标准输入重定向才能写入交互内容 UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden }); // 向win-acme进程写入交互指令 wacsProcess.StandardInput.WriteLine("N"); // 写入完成后关闭输入流,避免进程一直等待输入导致卡死 wacsProcess.StandardInput.Close(); wacsProcess.WaitForExit(); string output = wacsProcess.StandardOutput.ReadToEnd(); File.WriteAllText(@".\OutPutAfterFirstLaunch.txt", output);
注意:模拟交互输入的方案兼容性很差,win-acme版本更新如果调整了菜单位置、顺序、提示逻辑,输入逻辑会直接失效,无特殊需求优先使用官方非交互式参数。
内容的提问来源于stack exchange,提问作者Chicharito
相关产品推荐
相关产品推荐

