代码之家  ›  专栏  ›  技术社区  ›  Hector Sosa Jr

使用system.diagnostics.process在命令行上的文件中管道

  •  8
  • Hector Sosa Jr  · 技术社区  · 17 年前

    我正在尝试运行一个命令行程序,并在文件中进行管道连接。命令在命令行上运行良好,但我似乎无法让它与C中的流程对象一起工作。这是我发出的命令:

    “c:\servers\collabnet subversion server\svnadmin”加载c:\stores\test load<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;
    }
    

    我尝试过几种不同的函数组合,但是我不能让它工作。我一直收到“系统找不到指定文件”的消息。我已经做了一个星期了,我想我需要一双眼睛来看看我做错了什么。

    3 回复  |  直到 17 年前
        1
  •  8
  •   Hector Sosa Jr    17 年前

    马克和卢克都给了我正确的方向。我不能使用任何一个答案,因为我必须这样做,以便它可以在Linux中运行mono。所以我按照建议写了标准输入。以下是有效的代码:

    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;
    }
    
        2
  •  5
  •   Luke Quinane George    17 年前

    我不是100%确定,但我猜你必须手动从 test.dump 使用它的 StandardInput 财产。

    否则你可以尝试使用 cmd.exe 要执行命令:

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

    这是因为“>”、“<”和“”运算符是由shell本身(cmd.exe)实现的。

        3
  •  1
  •   Mark Brackett    17 年前

    我猜您应该自己钩住标准输入并在文件中写入。您可以尝试使用shellexecute=true,但我不确定它是否有效。