Запуск нескольких команд через cmd.exe с использованием C#

Я пытаюсь запустить несколько команд в одном экземпляре процесса, и то, что у меня есть, работает, но оно зависает и ничего не делает после 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 только в один файл, но причина, по которой я просто иду по первой букве, заключается в том, что размер пакета слишком велик для серверов MySQL по умолчанию с одним большим импортом sql. (программа предназначена для публичного выпуска, и мне бы не хотелось заставлять всех редактировать свой max_packet_size только для того, чтобы использовать приложение)

Итак, мне в основном нужна помощь, чтобы выяснить, почему он выполняет только часть команд или есть ли другой способ сделать это.


person Hyperion    schedule 19.02.2014    source источник
comment
Просто предложение, рассматривали ли вы возможность использования File.Copy вместо этого?   -  person John Gibb    schedule 19.02.2014
comment
@JohnGibb, комментарий, который вы удалили, - это то, что сработало для меня. Запуск в собственном консольном приложении. Спасибо. (Нет, я не пробовал File.Copy вместо этого, это не совсем тот путь, по которому я хочу идти)   -  person Hyperion    schedule 19.02.2014


Ответы (2)


Я вижу, что вы перенаправляете как StdIn, так и StdOut, но как только вы начинаете процесс, вы записываете только в StdIn, но не предоставляете никакого приемника для перенаправления StdOut. Итак, что, вероятно, происходит, так это то, что дочерний процесс записывает, ничего не читает, поэтому он блокируется, когда StdOut заполнен, и вы получаете взаимоблокировку. Попробуйте установить RedirectStandardOutput=false, и это должно помочь.

person LB2    schedule 19.02.2014
comment
Ну, это был прогресс, спасибо, но теперь он останавливается на команде 13 и не продолжается. - person Hyperion; 19.02.2014
comment
Дох! Также установите RedirectStandardError в false. т.е. перенаправлять только те потоки, которые вы планируете обрабатывать самостоятельно, все остальные оставить как есть. - person LB2; 19.02.2014
comment
Пару недель назад я написал небольшую программу, которая перенаправляет только StdOut и работает без проблем... но StdOut, а не StdIn... Возможно, StdIn отличается, но я был бы удивлен, если бы это было так. Я почти уверен, что StdErr является вторым виновником кода. - person LB2; 19.02.2014
comment
Да, держу пари, ты прав. Я собираюсь удалить свой предыдущий комментарий, чтобы не путать людей в будущем! - person John Gibb; 19.02.2014

Получил этот ответ из другого сообщения, Программное использование cmd. exe из C#

Запуск cmd в собственной консоли сработал.

person Hyperion    schedule 19.02.2014