使用 System.Diagnostics.Process 在命令行上的文件中进行管道传输 [英] Piping in a file on the command-line using System.Diagnostics.Process
问题描述
我正在尝试运行命令行程序并在文件中进行管道传输.该命令在命令行上运行良好,但我似乎无法让它与 C# 中的 Process 对象一起使用.这是我发出的命令:
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:ServersCollabNet Subversion Serversvnadmin"加载 C:RepositoriesTestLoad
C:Temp est.dump
"C:ServersCollabNet Subversion Serversvnadmin" load C:RepositoriesTestLoad < C:Temp est.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.
推荐答案
马克和卢克都给了我正确的方向.我不能使用任何一个答案,因为我必须这样做才能在 Linux 中与 Mono 一起运行.所以我最终按照建议写入了 StandardInput.这是有效的代码:
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;
}
这篇关于使用 System.Diagnostics.Process 在命令行上的文件中进行管道传输的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!