我正在尝试在一个流程实例中运行多个命令,而我所拥有的工作正在运行,但它会在编写器中的第7或第8个命令之后挂起并且不执行任何操作。
这是我的代码:
Process p = new Process();
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "cmd.exe";
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.CreateNoWindow = true;
p.StartInfo = info;
p.Start();
using (StreamWriter sw = p.StandardInput)
{
sw.WriteLine("copy /b updates\\EDB-master\\tables\\a*.sql a_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\b*.sql b_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\c*.sql c_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\d*.sql d_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\e*.sql e_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\f*.sql f_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\g*.sql g_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\i*.sql i_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\l*.sql l_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\m*.sql m_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\n*.sql n_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\o*.sql o_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\p*.sql p_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\q*.sql q_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\r*.sql r_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\s*.sql s_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\t*.sql t_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\v*.sql v_updates.sql");
sw.WriteLine("copy /b updates\\EDB-master\\tables\\w*.sql w_updates.sql");
}
p.WaitForExit();
我知道我可以完成将所有SQL文件写入一个文件,但我之所以要写第一个字母是因为对于具有一个大型sql导入的默认MySQL服务器来说,它的包大小太大了。 (程序是公开发布的,并且讨厌让每个人编辑他们的max_packet_size只是为了使用该应用程序)
所以我基本上需要帮助的是弄清楚为什么它只执行部分命令或者是否有其他方法可以做到这一点
答案 0 :(得分:1)
我看到你重定向StdIn和StdOut,但是一旦你开始这个过程,你只能写入StdIn,但是不为StdOut重定向提供任何接收器。所以可能发生的事情是,子进程正在进行,而不是正在读取,因此它在StdOut已满时阻塞,并且您遇到了死锁。尝试设置RedirectStandardOutput=false
,并且应该这样做。
答案 1 :(得分:0)
从其他帖子Programmatic use of cmd.exe from C#
获得此答案在它自己的控制台中运行cmd。