Почему этот код С# не работает? Я пытаюсь прочитать вывод оболочки в TortoiseHG (Mercurial)

Я пытаюсь запустить mercurial в оболочке из моего приложения C# wpf. Моя цель - получить вывод в строку, чтобы я мог ее проанализировать.

К сожалению для меня, кажется, что hg.exe (от tortoiseHg) ничего не возвращает через приведенный ниже код. Другие .exe работают, как видно из комментариев ниже;

Мой код ниже;

`

        string workingDir = "";
        string filename = "";
        string param = "";

        //This works
        workingDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        filename = "unrar.exe";
        param = "";

        //this works
        workingDir = "c:\\program files\\WinRar";
        filename = "unrar.exe";
        param = "";

        //this works
        workingDir = "C:\\Program Files (x86)\\TortoiseHg";
        filename = "docdiff.exe";
        param = "";

        //this does not work. I get a null returned. Why?
        workingDir = "C:\\Program Files (x86)\\TortoiseHg";
        filename = "hg.exe";
        param = "";

        //this does not work. I get a null returned. Why?
        workingDir = "C:\\Program Files (x86)\\TortoiseHg";
        filename = "hg.exe";
        param = "help";

        string retVal = "";
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.WorkingDirectory = workingDir;            
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.FileName = filename;
        proc.StartInfo.Arguments = param;
        proc.Start();

        System.IO.StreamReader reader = proc.StandardOutput;
        retVal = reader.ReadToEnd();
        System.Windows.MessageBox.Show(retVal);`

Если бы кто-нибудь мог предложить, почему этот код не работает, или, альтернативно, другой метод получения вывода командных строк mercurial, я был бы очень признателен.

Спасибо


person Obbles    schedule 09.11.2010    source источник
comment
Это может быть запись стандартной ошибки?   -  person McKay    schedule 10.11.2010
comment
(Бесстыдный плагин) Привет, я начал работать над оболочкой командной строки Mercurial, которая будет анализировать и преобразовывать весь вывод и команды Mercurial в более синтаксис C#-y. Если вам интересно, вы можете следить за проектом здесь: bitbucket.org/lassevk/mercurial.net   -  person Lasse V. Karlsen    schedule 10.11.2010
comment
любое окончательное решение с полным образцом исходного кода, работающим над этим?   -  person Kiquenet    schedule 08.07.2013


Ответы (4)


Ваш код у меня работает (проверено с TortoiseHg 2.0.2), при условии, что я передаю полный путь к исполняемому файлу:

proc.StartInfo.FileName = "C:\\Program Files (x86)\\TortoiseHg\\hg.exe";
person alexandrul    schedule 22.03.2011

Я предполагаю, что вывод идет к стандартной ошибке.

На этой странице рассказывается о том, как это сделать:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standarderror.aspx

person Hogan    schedule 09.11.2010

Я думаю, вам может понадобиться

proc.WaitForExit();

перед тем, как вы прочитаете до конца вызова? Если процесс не является интерактивным, у вас другая проблема.

person McKay    schedule 09.11.2010

Вы можете рассмотреть возможность обработки событий Process.OutputDataReceived и ErrorDataReceived:

proc.ErrorDataReceived += delegate(object o, DataReceivedEventHandler e)
  {
      if (e.Data != null) { /* e.Data is the string from the process */ }
  };
proc.OutputDataReceived += delegate(object o, DataReceivedEventHandler e)
  {
      // ...
  };

Обязательно вызовите proc.BeginErrorReadLine() и proc.BeginOutputReadLine() после запуска процесса.

person TreDubZedd    schedule 09.11.2010
comment
любое окончательное решение с полным образцом исходного кода, работающим над этим? - person Kiquenet; 08.07.2013