Передача в файл в командной строке с помощью System.Diagnostics.Process - PullRequest
8 голосов
/ 12 мая 2009

Я пытаюсь запустить программу командной строки и записать в файл. Команда отлично работает в командной строке, но я не могу заставить ее работать с объектом Process в C #. Вот команда, которую я выдаю:

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

Я пробовал несколько разных комбинаций этой функции, но не могу заставить это работать. Я продолжаю получать сообщение «Система не может найти указанный файл». Я занимаюсь этим уже неделю, и думаю, мне нужно несколько глаз, чтобы понять, что я делаю неправильно.

Ответы [ 3 ]

8 голосов
/ 12 мая 2009

И Марк, и Люк дали мне верное направление. Я не мог использовать ни один ответ, потому что я должен был сделать это, чтобы он мог работать с Mono в Linux. Так что я закончил писать в 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;
}
5 голосов
/ 12 мая 2009

Я не уверен на 100%, но я предполагаю, что вам придется вручную передавать данные из test.dump в процесс, используя его свойство StandardInput

В противном случае вы можете попробовать использовать cmd.exe для выполнения команды:

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

Причина этого в том, что ">", "<" и "|" операторы реализуются самой оболочкой (cmd.exe). </p>

1 голос
/ 12 мая 2009

Я предполагаю, что вы должны подключить StandardInput и записать в файл самостоятельно. Вы можете попробовать с ShellExecute = true, но я не уверен, что это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...