我正在尝试使用控制台应用程序自动执行 svn 更新的更新过程。我在下面使用以下代码。
ProcessStartInfo svnUpdate = new ProcessStartInfo();
svnUpdate.Arguments = string.Format("update "{0}" -r {1}", destination, revisionNo);
svnUpdate.FileName = "svn.exe";
svnUpdate.CreateNoWindow = true;
svnUpdate.UseShellExecute = false;
svnUpdate.WindowStyle = ProcessWindowStyle.Hidden;
svnUpdate.RedirectStandardOutput = true;
svnUpdate.RedirectStandardError = true;
Process p = new Process();
p.StartInfo = svnUpdate;
p.EnableRaisingEvents = true;
p.Start();
svnOutPut = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (p.HasExited)
{
Console.WriteLine("Received Output Test : " + svnOutPut);
}
p.Close();
p.Dispose();
如果更新命令没有返回任何错误,则上面的代码工作正常。如果有一些错误,我只能返回输出的第一行,但是当我在控制台下方设置代码时,会给我完整的错误文本。
svnUpdate.RedirectStandardOutput = false;
svnUpdate.RedirectStandardError = false;
当我将重定向为 false 时的示例输出。
Updating 'C:TestSvnRepo':
svn: E175002: Unable to connect to a repository at URL 'http://svnrepositoryAdd/svn/TestSvnRepo'
svn: E175002: Unexpected HTTP status 500 'Internal Server Error' on '/svn/TestSvnRepo'
svn: E720003: Additional errors:
svn: E720003: Could not open the requested SVN filesystem
当我重定向到 True 时,在字符串中收到的示例输出。
Updating: 'C:TestSvnRepo':
您缺少的输出是通过STDERR
发送的,而不是STDOUT
。在您的代码中,您只查看STDOUT
( svnOutPut = p.StandardOutput.ReadToEnd();
)
您还需要阅读STDERR
- p.StandardError.ReadToEnd();
顺便说一句,我建议不要自动化svn.exe
并添加应用程序和环境依赖关系(IOW,您的应用程序要求svn.exe
存在于系统上并且位于您指定的%PATH%
或已知绝对路径中),而是使用 SharpSVN,它提供了 SVN API 本身的 .NET 实现。