Piping in a file on the command-line using System.Diagnostics.Process

后端 未结 3 909
野的像风
野的像风 2020-12-01 15:01

I\'m trying to run a command-line program and piping in a file. The command works fine on the command-line, but I can\'t seem to get it to work with the Process object in C#

3条回答
  •  [愿得一人]
    2020-12-01 15:44

    Both Mark and Luke gave me the right direction to go. I couldn't use either answer because I had to do this so that it could run with Mono in Linux. So I ended up writing to the StandardInput as suggested. Here is the code that works:

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

提交回复
热议问题