Команда оболочки FIND не работает при выполнении с .NET Process.Start с перенаправленными выходными потоками

У меня проблема с командой поиска оболочки Windows в файле bat. Вывод команды find всегда пустой. Bat-файл выполняется с использованием метода .NET Process.Start в C#. Я использую перенаправление выходного потока. Что я хочу сделать:

ProcessStartInfo processInfo = new ProcessStartInfo("c:\test.bat")
{
  CreateNoWindow = true,                        
  UseShellExecute = false,
  RedirectStandardOutput = true,
  RedirectStandardError = true
};
Process testProcess = new Process();
testProcess.EnableRaisingEvents = true;
testProcess.OutputDataReceived += new DataReceivedEventHandler(testProcess_OutputDataReceived);
testProcess.ErrorDataReceived += new DataReceivedEventHandler(testProcess_ErrorDataReceived);                    
testProcess.StartInfo = processInfo;
testProcess.Start();

Пакетный файл (c:\test.bat) содержит команду find с перенаправлением на выходной файл:

find /I "TestString" "c:\TestInput.xml" > output.txt

Перенаправление outputStream работает нормально, но содержимое output.txt пусто (размер файла 0B). Когда я выполняю ту же пакетную команду, output.txt содержит найденные вхождения строк. Можно ли заставить команду find в командном файле работать с Process.Start и перенаправленными потоками вывода?

Спасибо за вашу помощь.


person user1012254    schedule 25.10.2011    source источник
comment
Как вы получаете вывод, чтобы получить пустой результат?   -  person Joulukuusi    schedule 25.10.2011
comment
Пожалуйста, покажите полный пример кода, демонстрирующий проблему.   -  person    schedule 25.10.2011


Ответы (2)


Вы не можете запустить пакетный файл напрямую через класс Process, когда ShellExecute отключен (и вы не можете перенаправить с включенным ShellExecute). Это связано с тем, что пакетные файлы в некотором смысле не являются исполняемыми, это искусственная конструкция в проводнике.

В любом случае, что вы можете сделать, чтобы это исправить, это напрямую использовать cmd.exe, например. измените свой ProcessStartInfo на что-то вроде:

new ProcessStartInfo(@"cmd.exe", @"/c C:\test.bat")

А также убедитесь, что вы ждете выхода команды.

person tyranid    schedule 30.10.2011

Без дополнительной информации невозможно сказать, какая у вас проблема. Тем не менее, следующие работы:

var find = new Process();
var psi = find.StartInfo;
psi.FileName = "find.exe";
psi.UseShellExecute = false;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;

// remember to quote the search string argument
psi.Arguments = "\"quick\" xyzzy.txt";

find.Start();

string rslt = find.StandardOutput.ReadToEnd();

find.WaitForExit();

Console.WriteLine("Result = {0}", rslt);

Console.WriteLine();
Console.Write("Press Enter:");
Console.ReadLine();
return 0;

Выполнение этого с моим образцом файла дает те же результаты, что и при запуске find из командной строки с теми же аргументами.

Здесь вас может сбить с толку то, что команда find требует, чтобы аргумент строки поиска был заключен в кавычки.

person Jim Mischel    schedule 25.10.2011
comment
Спасибо за Ваш ответ. Я отредактировал свой предыдущий пост и добавил лучшее описание моей проблемы. - person user1012254; 31.10.2011