使用System.Diagnostics.Process在命令行上的文件中管道

我正在尝试运行命令行程序并在文件中管道。 该命令在命令行上运行正常,但我似乎无法使用C#中的Process对象。 这是我发出的命令:

“C:\ Servers \ CollabNet Subversion Server \ svnadmin”加载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; } 

我已经尝试了这个function的几种不同组合,但我无法让它工作。 我一直收到“系统找不到指定文件”的消息。 我已经在这里待了大约一个星期了,我想我需要一些眼睛来看看我做错了什么。

马克和卢克都给了我正确的方向。 我无法使用任何一个答案,因为我必须这样做才能在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; } 

我不是100%肯定,但我的猜测是你必须使用其StandardInput属性手动将数据从test.dump推送到进程。

否则,您可以尝试使用cmd.exe来执行命令:

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

原因是“>”,“<”和“|” 运算符由shell本身实现(cmd.exe)。

我的猜测是你应该挂钩StandardInput并自己写入文件。 您可以尝试使用ShellExecute = true,但我不确定它是否有效。