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#. Here's the command I'm issuing:
"C:\Servers\CollabNet Subversion Server\svnadmin" load C:\Repositories\TestLoad < C:\Temp\test.dump
This function works fine with all the other commands that I pass to it, except for the command above:
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;
}
I've tried several different combinations of this function, but I can't get this to work. I keep getting a "The system cannot find the file specified" message. I've been at this for about a week now, and I think I need a few set of eyes to see what I'm doing wrong.
My guess is that you should hook the StandardInput and write in the file yourself. You could try with ShellExecute = true, but I'm not sure it'd work.
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:
I'm not 100% sure but my guess would be that you have to manually push the data from
test.dump
to the process using itsStandardInput
property.Otherwise you could try using
cmd.exe
to execute the command:The reason for this is that the ">", "<" and "|" operators are implemented by the shell itself (cmd.exe).