XCopy не работает с UseShellExecute = false

Я пытаюсь запустить пакетный файл из .net/С#, используя System.Diagnostics.Process. Почему-то он не выполняет команду xcopy пакетного файла.

Пример пакетного файла:

#copy test to test2 including sub directories
xcopy c:\test\ c:\test2 

Код С#:

    public void RunMSIBatchFile(string _workingDirectory, string batchFileName)
    {
        var process = new Process
        {
            StartInfo =
            {

                UseShellExecute = false,
                RedirectStandardOutput = true,
                WorkingDirectory = _workingDirectory,
                FileName = _workingDirectory + batchFileName,
                CreateNoWindow = true,
                RedirectStandardError = true
            }
        };

        process.OutputDataReceived += ProcessOutputDataReceived;
        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit(Convert.ToInt32(CommandTimeOut.TotalMilliseconds));
    }

Если я изменю UseShellExecute на true, тогда это сработает, но, похоже, нет возможности захватить стандартный вывод.

Кто-нибудь сталкивался с такой проблемой?


person developer    schedule 08.01.2013    source источник
comment
XCopy особенный. Он не будет работать правильно, если вы только перенаправляете его вывод. Вам также придется перенаправить ввод.   -  person Hans Passant    schedule 08.01.2013
comment
Привет, перенаправление стандартного ввода решило проблему. Большое спасибо :)   -  person developer    schedule 08.01.2013
comment
Оказалось, что перенаправление STDIN было ответом и на это в нашей ситуации. Без перенаправления STDIN xcopy вернет файл, не найденный в STDERR, что не имеет большого смысла. Все остальные стандартные утилиты вроде бы работали нормально. Ганс, может быть, сделать отдельный ответ на этот вопрос?   -  person Jeremy Murray    schedule 31.07.2014


Ответы (1)


Я проверил ваш точный код и, кажется, могу получать данные очень хорошо. Однако, поскольку чтение происходит асинхронно, WaitForExit(...) может вернуться до того, как вы прочитаете все данные. Похоже, что конец данных сигнализируется тем, что свойство Data DataReceivedEventArgs, переданное обработчику событий OutputDataReceived, имеет значение null.

Также стоит отметить, что если xcopy запрашивает ввод от пользователя (например, в случае файла с таким же именем, существующего в месте назначения), кажется, что данные не возвращаются. Вы можете проверить это в своем пакетном файле или также обработать данные из потока стандартных ошибок.

person Iridium    schedule 08.01.2013