1

我正在尝试编写一个为 tf.exe (在 TFS 2010 中)提供我自己的 UI 的应用程序。(是的,我知道 VS 已经这样做了,但这个应用程序是自定义的)。对于某些命令,例如属性,我想从标准输出捕获输出。此外,当命令失败时,我想从 stderr 捕获其错误输出。我正在使用 .NET 的 Process 类来启动 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”时,我注意到当标准错误被重定向时,我不再看到通常打开的签入对话框。相反,签入只是发生了。因此,似乎为 tf.exe 重定向 stderr 的行为就像我设置了 noprompt 标志一样。有谁知道如何在不停止 tf.exe 对话框提示的情况下捕获标准错误数据?

谢谢,

-克雷格

4

2 回答 2

2

您最好直接调用TFS API,而不是从代码中调用 tf.exe。这样您就可以更好地控制应用程序的行为以及异常而不是 stderr 的所有好处。该 API 还公开了比 tf.exe tfpt.exe 和 Visual Studio 提供的更多功能。

于 2012-02-05T15:35:09.093 回答
1

最后,在对此感到沮丧几个月后,我找到了解决方案。

显然,tf.exe 有一个名为 /prompt 的隐藏参数,即使您重定向了标准输出,它也会强制显示 UI。

资料来源: http: //www.wintellect.com/cs/blogs/jrobbins/archive/2006/12/26/working-offline-with-tfs.aspx

于 2012-12-12T10:11:00.507 回答