当Startinfo.RedirectStandardOutput设置为true时,进程退出

时间:2013-07-22 12:49:25

标签: c# .net command-line process tfs

我正在尝试开发一个执行tfs merge.Command执行的控制台应用程序:

tf合并$ / CodeBase / ALPHA $ / CodeBase / BETA / recursive / version:C4~C6

如果合并操作中存在冲突,则首先引发错误,并在解决冲突的地方显示解决冲突窗口。解决冲突后,将显示最终输出。

对于执行tf merge的控制台应用程序,

c#代码如下:

Process proc = new Process();                
proc.StartInfo.FileName = "tf.exe";
proc.StartInfo.Arguments = " merge $/CodeBase/ALPHA $/CodeBase/BETA /version:C4~C6";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.Start();
proc.WaitForExit();
string line1 = proc.StandardOutput.ReadLine();
string line2 = proc.StandardError.ReadToEnd();

问题:

该进程退出,只显示初始错误消息。理想情况下,它应该等到我解决所有冲突,然后进程将等到那时。 但是因为我正在设置 proc.StartInfo.RedirectStandardError = true; ,所以应用程序不会等待解决冲突窗口(甚至没有启动它)。但如果我评论这一行,它正常工作,但我无法读取最终输出。

请帮帮我。

编辑:7/23

我相信我正在进行异步读取操作(可能会出现问题)。有没有办法可以执行同步读取???

2 个答案:

答案 0 :(得分:0)

您必须附加事件处理程序     proc.ErrorDataReceived + =(s,e)=> ErrorLine(e.Data);     proc.OutputDataReceived + =(s,e)=> OutputLine(e.Data);

void ErrorLine(string text)
{
    Console.ForegroundColor = ConsoleColor.White;
    Console.BackgroundColor = ConsoleColor.DarkRed;
    Console.Error.WriteLine(text);
    Console.ResetColor();
}
void OutputLine(string text)
{
    Console.Error.WriteLine(text);
}

答案 1 :(得分:0)

问题在于TFS如果检测到stdout重定向则使用'/ noprompt'执行。 通过设置环境变量TFS_IGNORESTDOUTREDIRECT = 1来解决问题。