【问题标题】:Piping in a file on the command-line using System.Diagnostics.Process使用 System.Diagnostics.Process 在命令行上输入文件
【发布时间】:2010-10-25 10:44:58
【问题描述】:

我正在尝试在文件中运行命令行程序和管道。该命令在命令行上运行良好,但我似乎无法让它与 C# 中的 Process 对象一起使用。这是我发出的命令:

"C:\Servers\CollabNet Subversion Server\svnadmin" 加载 C:\Repositories\TestLoad

除了上面的命令之外,此函数适用于我传递给它的所有其他命令:

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;
}

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

【问题讨论】:

    标签: c# command-line


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      原因是“>”、“

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-15
          • 2016-01-17
          相关资源
          最近更新 更多