当前位置:编程学习 > C#/ASP.NET >>

关于C#中调用CMD进程处理文件应用程序卡死的问题

            System.Diagnostics.Process cmd = new System.Diagnostics.Process();
            cmd.StartInfo.FileName = "cmd";       
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.RedirectStandardError = true;
            cmd.StartInfo.CreateNoWindow = true;         
            cmd.Start();
            cmd.StandardInput.AutoFlush = true;
            for (i = 0; i < listView1.Items.Count; i++)
            {
                cmd.StandardInput.WriteLine(listView1.Items[i].SubItems[1].Text ); //I超过40的时候应用程序未响应????
            }
            cmd.StandardInput.WriteLine("exit");
            string info = cmd.StandardOutput.ReadToEnd();
            cmd.WaitForExit();
            cmd.Close();

最好能给出程序 小弟新手 感激不尽 --------------------编程问答-------------------- 我嗒嗒的马蹄声是一个美丽的错误,我不是归人,是过客 --------------------编程问答-------------------- 如果程序改成这样 虽然不会卡死 但是info中只有第一次循环时的输出 为什么呢?
            string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
            int i = 0,j = 60;
            System.Diagnostics.Process cmd = new System.Diagnostics.Process();  
            cmd.StartInfo.FileName = "cmd";       
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.RedirectStandardError = true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.Start();
            cmd.StandardInput.AutoFlush = true;
            StringBuilder info = new StringBuilder();
            try
            {
                for (i = 0; i < j; i++)
                {
                    cmd.StandardInput.WriteLine(s);
                    cmd.StandardInput.WriteLine("exit");
                    info.Append(cmd.StandardOutput.ReadToEnd());
                }
                cmd.StandardInput.Close();
                cmd.StandardOutput.Close();
                cmd.Close();
                MessageBox.Show(info.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception m)
            {
                MessageBox.Show(m.ToString());
            }
--------------------编程问答-------------------- 没人知道么 纠结很久了。。 --------------------编程问答-------------------- 唉。。。。。 --------------------编程问答--------------------  System.Diagnostics.Process cmd = new System.Diagnostics.Process();
            cmd.StartInfo.FileName = "cmd";       
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.RedirectStandardError = true;
            cmd.StartInfo.CreateNoWindow = true;         
            cmd.Start();
            cmd.StandardInput.AutoFlush = true;
            for (i = 0; i < listView1.Items.Count; i++)
            {
                cmd.StandardInput.WriteLine(listView1.Items[i].SubItems[1].Text ); //I超过40的时候应用程序未响应????
            }
           
            string info = cmd.StandardOutput.ReadToEnd();
            cmd.StandardInput.WriteLine("exit");
            cmd.WaitForExit();
            cmd.Close(); --------------------编程问答--------------------  cmd.StandardInput.WriteLine("exit");
cmd 退出了 --------------------编程问答--------------------
引用 5 楼 angel6709 的回复:
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
            cmd.StartInfo.FileName = "cmd";       
            cmd.StartInfo.RedirectStandardOutput = true;
        ……

这样直接就卡死了。。 --------------------编程问答-------------------- 订阅一下错误处理和输出处理事件

我们不知道你是啥错,你必须清楚的知道你的错误是啥,我们才有排错的可能

这里不是直接try,而是定义poress的事件,相关事件说明请看msdn

http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process_events(v=vs.80).aspx --------------------编程问答-------------------- hack:我个人调试这类程序,其实是首先
  cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.RedirectStandardError = true;
            cmd.StartInfo.CreateNoWindow = true;      

把这端参数全改掉,你这里是不显示cmd窗口,不使用shell,同时输入重定向,错误重定向。这样的设置不利于调试,我个人首先会让他显示cmd,使用shell,也不截获IO,这样的好处是执行过程就显示在那里,一目了然,那里错了,一看就知道。等我调试无误了,在把参数改回成你这种“隐藏”滴 --------------------编程问答-------------------- 好吧 我重新说我的问题  大概的程序是这样的 调用控制台批量处理文件 就类似于调用csc编译器批量编译文件 然后读取cmd里的内容 弹出处理报告 现在的问题是如果文件名过长 文件过多(也就是下面测试代码中的s过长 j过大的情况)会导致程序卡死
下面是测试代码       
string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
            int i = 0,j = 60;
            System.Diagnostics.Process cmd = new System.Diagnostics.Process();  
            cmd.StartInfo.FileName = "cmd";       
            cmd.StartInfo.RedirectStandardOutput = true;
            cmd.StartInfo.RedirectStandardInput = true;
            cmd.StartInfo.UseShellExecute = false;
            cmd.StartInfo.RedirectStandardError = true;
            cmd.StartInfo.CreateNoWindow = true;
            cmd.Start();
            cmd.StandardInput.AutoFlush = true;
            StringBuilder info = new StringBuilder();        
                for (i = 0; i < j; i++)
                {
                    cmd.StandardInput.WriteLine(s);  //s过长j过大时 卡死                                 
                }
                cmd.StandardInput.WriteLine("exit");
                info.Append(cmd.StandardOutput.ReadToEnd());                              
                cmd.StandardInput.Close();
                cmd.StandardOutput.Close();
                cmd.Close();
                MessageBox.Show(info.ToString());



个人猜想可能是info.Append(cmd.StandardOutput.ReadToEnd());这句的原因 于是把测试代码改成了下面的这种 发现程序没有卡死了 但是info中的内容只是第一次循环的时候cmd中的内容 由于要对cmd里的内容进行处理 弹出处理报告 所有必须要获取到cmd里面的全部内容 情况大致就是这样。。。
			string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
int i = 0,j = 60;
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.StandardInput.AutoFlush = true;
StringBuilder info = new StringBuilder();
for(i = 0; i < j; i++)
{
cmd.StandardInput.WriteLine(s);
cmd.StandardInput.WriteLine("exit"); 
info.Append(cmd.StandardOutput.ReadToEnd());
}
cmd.StandardInput.Close();
cmd.StandardOutput.Close();
cmd.Close();
MessageBox.Show(info.ToString());
--------------------编程问答-------------------- 循环哪里不可以那么写的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,