2009-05-12 39 views
8

Tôi đang cố chạy chương trình dòng lệnh và đường ống trong tệp. Lệnh này hoạt động tốt trên dòng lệnh, nhưng tôi không thể làm cho nó hoạt động với đối tượng Process trong C#. Dưới đây là các lệnh tôi phát hành:Đường ống trong một tệp trên dòng lệnh bằng System.Diagnostics.Process

"C: \ Servers \ CollabNet Subversion Server \ svnadmin" tải C: \ Repositories \ TestLoad < C: \ Temp \ test.dump

Chức năng này hoạt động tốt với tất cả các lệnh khác mà tôi chuyển cho nó, ngoại trừ lệnh trên:

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; 
} 

Tôi đã thử một số kết hợp khác nhau của chức năng này, nhưng tôi không thể làm việc này được. Tôi tiếp tục nhận được thông báo "Hệ thống không thể tìm thấy tệp được chỉ định". Tôi đã ở đây khoảng một tuần nay, và tôi nghĩ rằng tôi cần một vài bộ mắt để xem tôi đang làm gì sai.

Trả lời

8

Cả Mark và Luke đều cho tôi hướng đi đúng. Tôi không thể sử dụng một trong hai câu trả lời bởi vì tôi đã phải làm điều này để nó có thể chạy với Mono trong Linux. Vì vậy, tôi đã kết thúc bằng văn bản cho StandardInput như đã đề xuất. Đây là mã hoạt động:

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

Tôi đoán là bạn nên móc StandardInput và tự ghi vào tệp. Bạn có thể thử với ShellExecute = true, nhưng tôi không chắc nó có hoạt động không.

5

Tôi không chắc chắn 100% nhưng dự đoán của tôi là bạn phải tự đẩy dữ liệu từ test.dump đến quy trình sử dụng thuộc tính StandardInput của nó.

Nếu không, bạn có thể thử sử dụng cmd.exe để thực hiện lệnh:

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

Lý do cho điều này là những ">", "<" và "|" các toán tử được thực hiện bởi chính shell (cmd.exe).

Các vấn đề liên quan