2009-05-12 6 views
8

Estoy tratando de ejecutar un programa de línea de comandos y tuberías en un archivo. El comando funciona bien en la línea de comandos, pero parece que no puedo hacer que funcione con el objeto Process en C#. Aquí está el comando que estoy emisión:Tubería en un archivo en la línea de comandos usando System.Diagnostics.Process

"C: \ Servers \ CollabNet Subversion Servidor \ svnadmin" carga C: \ repositorios \ testload < C: \ Temp \ test.dump

Esta función funciona bien con todos los otros comandos que los que paso a ella, excepto por el comando anterior:

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

he probado varias combinaciones diferentes de esta función, pero no puedo conseguir que esto funcione. Sigo recibiendo un mensaje "El sistema no puede encontrar el archivo especificado". Llevo aquí una semana, y creo que necesito algunos ojos para ver lo que estoy haciendo mal.

Respuesta

8

Tanto Mark como Luke nos dieron la dirección correcta para ir. No pude usar ninguna de las respuestas porque tenía que hacer esto para poder ejecutar con Mono en Linux. Así que terminé escribiendo en StandardInput como se sugirió. Aquí está el código que funciona:

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

Supongo que debe enganchar el StandardInput y escribir en el archivo usted mismo. Podrías probar con ShellExecute = true, pero no estoy seguro de que funcione.

5

No estoy 100% seguro, pero supongo que tendrá que insertar los datos manualmente desde test.dump al proceso utilizando su propiedad StandardInput.

De lo contrario, podría tratar de usar cmd.exe para ejecutar el comando:

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

La razón de esto es que el ">", "<" y "|" los operadores son implementados por el propio shell (cmd.exe).

Cuestiones relacionadas