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 resolving 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

答えてくれてありがとう、私は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 に答える
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 に答える