Как я могу захватить tf.exe stderr, не останавливая его диалоговые окна? - PullRequest
1 голос
/ 05 февраля 2012

Я пытаюсь написать приложение, предоставляющее собственный интерфейс для tf.exe (в TFS 2010). (да, я знаю, VS уже делает это, но это приложение на заказ). Для некоторых команд, таких как свойства, я хочу захватить вывод из stdout. Кроме того, когда команда терпит неудачу, я хочу захватить ее вывод ошибок из stderr. Я использую класс Process .NET для запуска tf.exe, вот так:

try
{
   sccProcess.StartInfo.FileName = "tf.exe"; 
   sccProcess.StartInfo.Arguments = arguments;
   sccProcess.StartInfo.CreateNoWindow = true;
   sccProcess.StartInfo.UseShellExecute = false;
   sccProcess.StartInfo.RedirectStandardOutput = true;
   sccProcess.StartInfo.RedirectStandardError = true;
   sccProcess.Start();

   output = sccProcess.StandardOutput.ReadToEnd();

   // Redirecting synchronously from output and error streams may cause a deadlock.
   // To prevent that, we always read the error stream asynchronously.
   sccProcess.ErrorDataReceived += (sender, args) => errorStringBuilder.Append(args.Data);
   sccProcess.BeginErrorReadLine();

   sccProcess.WaitForExit();
   exitCode = sccProcess.ExitCode;

   error = errorStringBuilder.ToString();
}
catch (Win32Exception)
{
    // The file name for the process couldn't be found.
    exitCode = -1;
}
finally
{
    sccProcess.Close();
}

Однако, когда я запускаю команду, скажем «tf checkin», я замечаю, что, когда стандартная ошибка перенаправляется, я больше не вижу диалоговое окно возврата, которое обычно открывается. Вместо этого регистрация просто происходит. Таким образом, похоже, что перенаправление stderr для tf.exe ведет себя так, как будто я установил флаг noprompt. Кто-нибудь знает, как я могу захватить данные stderr без остановки диалоговых окон tf.exe?

Спасибо

-Craig

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Возможно, лучше вызывать TFS API напрямую, а не вызывать tf.exe из кода.Таким образом, вы будете иметь гораздо больший контроль над поведением приложения и всеми преимуществами исключений, а не stderr.API также предоставляет гораздо больше функций, чем доступно в tf.exe, tfpt.exe и visual studio.

1 голос
/ 12 декабря 2012

Наконец, после нескольких месяцев разочарования по этому поводу, я нашел решение.

Очевидно, что в tf.exe есть скрытый параметр с именем / prompt, который заставляет отображать пользовательский интерфейс, даже если вы перенаправили стандартный вывод.

Источник: http://www.wintellect.com/cs/blogs/jrobbins/archive/2006/12/26/working-offline-with-tfs.aspx

...