3

嗨,我在后面的代码中使用 svn 命令时遇到问题:

public void SvnDiff(int rev1, int rev2)
        {
            try
            {
                var p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "svn";
                string arg = string.Format("diff -r {0}:{1} --summarize --xml > SvnDiff.xml", rev1, rev2);
                Console.WriteLine(arg);
                p.StartInfo.Arguments = arg;
                p.Start();
                p.WaitForExit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

当我在 cmd 中使用此命令时,它工作正常。svn diff -r 2882:2888 --summarize --xml > SvnDiff.xml

但是当我运行我的方法时,我收到了这条消息:svn: E020024: Error resolve case of '>'

我现在能做些什么来解决这个问题?感谢您的任何建议

4

4 回答 4

1

您可以阅读所有文本,然后按照@Scott 的建议写入文件,但如果输出太大,可能会出现问题。

您可以改为在生成输出时写入。为文件创建一个本地StreamWriter文件,以及一个在新输出数据可用时写入的方法:

StreamWriter redirectStream = new StreamWriter("SvnDiff.xml")

void Redirect(object Sender, DataReceivedEventArgs e)
{
  if ((e.Data != null)&&(redirectStream != null))
    redirectStream.WriteLine(e.Data);
}

当你开始这个过程时:

p.OutputDataReceived += new DataReceivedEventHandler(Redirect); // handler here to redirect
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();

redirectStream.Flush();
redirectStream.Close();
于 2013-03-28T23:04:37.970 回答
0

您的> SvnDiff.xml命令行部分不是传递给 SVN 的参数。他们正在重定向标准输出。为此,请查看文档

由于您已经正确设置了 RedirectStandardOutput,因此您只需要利用它。简单的说

string output = p.StandardOutput.ReadToEnd();

在你的p.WaitForExit();行前。

然后,只需使用File.WriteAllText("SvnDiff.xml", output);

于 2013-03-28T22:56:06.173 回答
0

试试这个......

var p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "cmd.exe";
string arg = string.Format("/K svn diff -r {0}:{1} --summarize --xml > SvnDiff.xml", rev1, rev2);
Console.WriteLine(arg);
p.StartInfo.Arguments = arg;
p.Start();
p.WaitForExit();

如果可行,则将 /K 更改为 /C

于 2013-03-28T22:56:52.437 回答
0

感谢您的回答,我使用 StandardOutput 并且它可以工作:)

var p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "svn";
                p.StartInfo.Arguments = string.Format("diff -r {0}:{1} --summarize --xml", rev1, rev2);
                p.Start();
                string output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                File.WriteAllText("SvnDiff.xml", output);

谢谢大家。

于 2013-03-28T23:23:29.377 回答