C#程序重定向标准输入后恢复cmd窗口键盘输入的方法
问题
我正在编写一个C# Windows Forms应用程序,该程序启动cmd进程,在调用Process.Start前设置RedirectStandardInput为true,以编程方式向cmd写入命令。但在应用程序写入cmd后,我希望重新启用键盘输入——执行完第一条命令后,无法在同一个cmd窗口中用键盘输入。
我的代码如下:
Process pr=new Process(); pr.StartInfo.FileName = "cmd.exe"; pr.StartInfo.RedirectStandardInput = true; pr.StartInfo.WorkingDirectory = currentFolder; pr.StartInfo.UseShellExecute = false; pr.Start(); pr.StandardInput.WriteLine(stringToWrite);
尝试在调用pr.StandardInput.WriteLine(stringToWrite);后设置pr.StartInfo.RedirectStandardInput = false;但没有效果,请问解决方案是什么?
解决方案
核心原因
进程启动后修改StartInfo的属性完全无效——StartInfo仅在进程启动前生效。当你设置RedirectStandardInput = true并启动进程后,cmd的标准输入会绑定到你的应用程序,而非控制台窗口的键盘,因此无法直接切换回键盘输入。
方案一:通过cmd参数直接执行命令并保留交互
不需要重定向输入,而是利用cmd的/k参数,让cmd启动时自动执行指定命令,执行完成后保持窗口交互状态:
Process pr = new Process(); pr.StartInfo.FileName = "cmd.exe"; // /k 参数表示执行命令后不关闭窗口,保持交互 pr.StartInfo.Arguments = $"/k {stringToWrite}"; pr.StartInfo.WorkingDirectory = currentFolder; pr.StartInfo.UseShellExecute = true; pr.Start();
方案二:重定向输入后启动新的cmd实例恢复交互
如果必须通过重定向输入执行初始命令,可以在写完命令后,向标准输入写入cmd命令,启动一个新的cmd实例接管控制台窗口,恢复键盘交互:
Process pr = new Process(); pr.StartInfo.FileName = "cmd.exe"; pr.StartInfo.RedirectStandardInput = true; pr.StartInfo.WorkingDirectory = currentFolder; pr.StartInfo.UseShellExecute = false; pr.Start(); // 执行初始命令 pr.StandardInput.WriteLine(stringToWrite); // 启动新的cmd实例,该实例会关联控制台窗口的键盘输入 pr.StandardInput.WriteLine("cmd"); // 关闭输入流,让原cmd进程结束,新进程完全接管窗口 pr.StandardInput.Close();
内容的提问来源于stack exchange,提问作者Reem Rizk
相关产品推荐
相关产品推荐

