C#使用Process操作CMD,process.StandardOutput.ReadToEnd阻塞/假死/获取不到信息/无法关闭CMD真正原因及解决方案!!

网上看了很多解决方案

有的说在最后一条命令执行"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;
}

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值