Пустые окна CMD при запуске файлов Bat - PullRequest
1 голос
/ 01 апреля 2012

Эй, я уже давно занимаюсь этой проблемой.Итак, часть моей программы требует от меня доступа к Adb (мост разработки Android), и я делаю это с помощью командных файлов и файлов bat.Проблема в том, что когда я запускаю свою программу, появляется пустое окно CMD, когда наступает время для выполнения команды bat, и она не запускается, пока я не закрою окно CMD.Любые идеи почему?

Вот что я попробовал:

 Process compiler = new Process();
        compiler.StartInfo.FileName = "push.bat";

        compiler.StartInfo.UseShellExecute = false;
        compiler.StartInfo.RedirectStandardOutput = true;
        compiler.StartInfo.RedirectStandardError = true;

        compiler.Start();
        string d = compiler.StandardOutput.ReadToEnd();
        MessageBox.Show(d);

Пустое окно CMD.Я также попробовал это

    Process compiler = new Process();
        compiler.StartInfo.FileName = "cmd.exe";
        compiler.StartInfo.Arguments = " /c push.bat";
        compiler.StartInfo.UseShellExecute = false;
        compiler.StartInfo.RedirectStandardOutput = true;
        compiler.StartInfo.RedirectStandardError = true;

        compiler.Start();
        string d = compiler.StandardOutput.ReadToEnd();
        MessageBox.Show(d);

Появляется пустое окно CMD с мигающим курсором, которое ничего не сделает, пока я его не закрою.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Я думаю, что вы читаете, пока поток не закроется, но он не закроется, пока не выйдет push.bat.

Попробуйте использовать OutputDataReceived и ErrorDataReceived события и метод <a href="http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx" rel="nofollow">WaitForExit</a>().

Это позволит вам асинхронно читать данные, и вы будете знать, когда они завершатся, когда ваш вызов пройдет вызов WaitForExit().

Пример:

Process compiler = new Process();
compiler.StartInfo.FileName = "push.bat";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.StartInfo.RedirectStandardError = true;

var d = new StringBuilder();
compiler.OutputDataReceived += (o, e) => d.AppendLine(e.Data);
compiler.ErrorDataReceived += (o, e) => d.AppendLine(e.Data);
compiler.Start();
compiler.WaitForExit();
MessageBox.Show(d.ToString());
0 голосов
/ 01 апреля 2012

Попробуйте "start / b SOMECOMMAND", вызвав вашу команду (или, альтернативно, в вашем .bat-файле)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...