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();
最好能给出程序 小弟新手 感激不尽

解决方案 »

  1.   

    如果程序改成这样 虽然不会卡死 但是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());
                }
      

  2.   

     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();
      

  3.   

     cmd.StandardInput.WriteLine("exit");
    cmd 退出了
      

  4.   

    订阅一下错误处理和输出处理事件我们不知道你是啥错,你必须清楚的知道你的错误是啥,我们才有排错的可能这里不是直接try,而是定义poress的事件,相关事件说明请看msdnhttp://msdn.microsoft.com/zh-cn/library/system.diagnostics.process_events(v=vs.80).aspx
      

  5.   

    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,这样的好处是执行过程就显示在那里,一目了然,那里错了,一看就知道。等我调试无误了,在把参数改回成你这种“隐藏”滴
      

  6.   

    好吧 我重新说我的问题  大概的程序是这样的 调用控制台批量处理文件 就类似于调用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());