我正在尝试运行命令行程序并在文件中管道。该命令在命令行上运行正常,但我似乎无法使用C#中的Process对象。这是我发出的命令:
“C:\ Servers \ CollabNet Subversion Server \ svnadmin”load C:\ Repositories \ TestLoad< C:\ TEMP \ 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;
}
我已经尝试过这个函数的几种不同组合,但是我无法使用它。我一直收到“系统找不到指定文件”的消息。我已经在这里待了大约一个星期了,我想我需要一些眼睛来看看我做错了什么。
答案 0 :(得分:8)
马克和卢克都给了我正确的方向。我无法使用任何一个答案,因为我必须这样做才能在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 :(得分:5)
我不是百分百肯定,但我的猜测是你必须使用test.dump
属性手动将数据从StandardInput
推送到进程。
否则您可以尝试使用cmd.exe
执行命令:
var psi = new ProcessStartInfo( "cmd.exe /c \"" + command "\"" );
原因是“>”,“<”和“|”运算符由shell本身实现(cmd.exe)。
答案 2 :(得分:1)
我的猜测是你应该挂钩StandardInput并自己写入文件。您可以尝试使用ShellExecute = true,但我不确定它是否有效。