网上看了很多解决方案
有的说在最后一条命令执行"exit",
有的说重定向标准错误输出要设置成false(process.StartInfo.RedirectStandardError = false;)
有的说命令执行完要获取输出信息,否则会一直等待↓↓↓↓↓
output = process.StandardOutput.ReadToEnd();
和errOutput = process.StandardError.ReadToEnd();
有的说要在等待程序执行完退出进程 process.WaitForExit();
............................................
看看来去结果都解决不了执行完命令获取不到输出,CMD挂起的问题!直到最后意外发现StandardInput是个IO流,IO流线程回收机制是不会主动回收的,这个需要我们手动去关闭它才行,果不其然,添加完这行代码,里面就解决了:process.StandardInput.Close();
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓我的代码: ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
private string ExecutionCMDOrders(List<string> list,bool isReadReturn) {
string output = null;
string errOutput = null;
try {
//创建一个进程
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
process.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
process.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
process.StartInfo.RedirectStandardError = true;//重定向标准错误输出
process.StartInfo.CreateNoWindow = true;//不显示程序窗口
process.Start();//启动程序
process.StandardInput.AutoFlush = true;
//输入命令
for (int i = 0; i < list.Count; i++) {
process.StandardInput.WriteLine(list[i]);
Console.WriteLine(i + " " + list[i]);
}
//ReadToEnd阻塞使用exit纯粹是扯淡
//process.StandardInput.WriteLine("exit");
//真正的原因是StandardInput流没有关闭,所以线程会一直等待新输入,以便获取产生的输出信息
process.StandardInput.Close();
//是否输出信息
if (isReadReturn) {
//获取cmd窗口的输出信息
output = process.StandardOutput.ReadToEnd();
errOutput = process.StandardError.ReadToEnd();
cmdOutput_textBox.AppendText(output + "\r\n" + errOutput);
//等待程序执行完退出进程
process.WaitForExit();
}
process.Close();
process.Dispose();
} catch (Exception ex) {
MessageBox.Show(ex.Message + "\r\n跟踪;" + ex.StackTrace);
}
return output;
}