2009-05-12 14 views
8

ファイルでコマンドラインプログラムとパイプを実行しようとしています。このコマンドはコマンドラインでうまく動作しますが、C#のProcessオブジェクトで動作するようには見えません。System.Diagnostics.Processを使用してコマンドラインでファイルをパイプする

"C:\サーバー\ CollabNetのSubversionのサーバーの\ svnadminは" ロード・C:\リポジトリ\ TestLoad < C:\一時\のtest.dump

この関数は、すべてで正常に動作しますが、ここで私が発行していますコマンドです私はそれに渡す他のコマンドは、上記のコマンドを除い:

public static bool ExecuteSvnCommand(string command, string arguments, out string result, out string errors) 
{ 
    bool retval = false; 
    string output = string.Empty; 
    string errorLines = string.Empty; 
    Process svnCommand = null; 
    var psi = new ProcessStartInfo(command); 

    psi.RedirectStandardOutput = true; 
    psi.RedirectStandardError = true; 
    psi.WindowStyle = ProcessWindowStyle.Hidden; 
    psi.UseShellExecute = false; 
    psi.CreateNoWindow = true; 

    try 
    { 
     Process.Start(psi); 
     psi.Arguments = arguments; 
     svnCommand = Process.Start(psi); 

     StreamReader myOutput = svnCommand.StandardOutput; 
     StreamReader myErrors = svnCommand.StandardError; 
     svnCommand.WaitForExit(); 

     if (svnCommand.HasExited) 
     { 
      output = myOutput.ReadToEnd(); 
      errorLines = myErrors.ReadToEnd(); 
     } 

     // Check for errors 
     if (errorLines.Trim().Length == 0) 
     { 
      retval = true; 
     } 
    } 
    catch (Exception ex) 
    { 
     string msg = ex.Message; 
     errorLines += Environment.NewLine + msg; 
    } 
    finally 
    { 
     if (svnCommand != null) 
     { 
      svnCommand.Close(); 
     } 
    } 

    result = output; 
     errors = errorLines; 

    return retval; 
} 

私は、この機能のいくつかの異なる組み合わせを試してみたが、私はこれを動作させることはできません。私は "システムが指定されたファイルを見つけることができません"というメッセージを得続けます。私はこれで約1週間はいましたが、私が何をやっているのかを見るためには、私はいくつかの目を必要としています。

答えて

8

MarkとLukeの両方が私に正しい方向を教えてくれました。 LinuxでMonoを実行できるように、これを行わなければならなかったので、どちらの答えも使用できませんでした。だから、私は、StandardInputに提出して提出しました。以下は動作するコードです:

public static bool ExecuteSvnCommandWithFileInput(string command, string arguments, string filePath, out string result, out string errors) 
{ 
    bool retval = false; 
    string output = string.Empty; 
    string errorLines = string.Empty; 
    Process svnCommand = null; 
    var psi = new ProcessStartInfo(command); 

    psi.RedirectStandardInput = true; 
    psi.RedirectStandardOutput = true; 
    psi.RedirectStandardError = true; 
    psi.WindowStyle = ProcessWindowStyle.Hidden; 
    psi.UseShellExecute = false; 
    psi.CreateNoWindow = true; 

    try 
    { 
     Process.Start(psi); 
     psi.Arguments = arguments; 
     svnCommand = Process.Start(psi); 

     var file = new FileInfo(filePath); 
     StreamReader reader = file.OpenText(); 
     string fileContents = reader.ReadToEnd(); 
     reader.Close(); 

     StreamWriter myWriter = svnCommand.StandardInput; 
     StreamReader myOutput = svnCommand.StandardOutput; 
     StreamReader myErrors = svnCommand.StandardError; 

     myWriter.AutoFlush = true; 
     myWriter.Write(fileContents); 
     myWriter.Close(); 

     output = myOutput.ReadToEnd(); 
     errorLines = myErrors.ReadToEnd(); 

     // Check for errors 
     if (errorLines.Trim().Length == 0) 
     { 
      retval = true; 
     } 
    } 
    catch (Exception ex) 
    { 
     string msg = ex.Message; 
     errorLines += Environment.NewLine + msg; 
    } 
    finally 
    { 
     if (svnCommand != null) 
     { 
      svnCommand.Close(); 
     } 
    } 

    result = output; 
    errors = errorLines; 

    return retval; 
} 
1

私の推測では、StandardInputをフックしてファイルに書き込む必要があります。 ShellExecute = trueで試してみることもできますが、うまくいくかどうかはわかりません。

5

私は100%は確信していませんが、test.dumpのデータを手動でStandardInputプロパティを使用してプロセスにプッシュしなければならないと思います。

そうでない場合は、コマンドを実行するためにcmd.exeを使用して試みることができる:

var psi = new ProcessStartInfo("cmd.exe /c \"" + command "\""); 

この理由は、その「>」、「<」であり、「|」演算子はシェル自体(cmd.exe)によって実装されます。

関連する問題