Перенаправить из дочернего процесса с .net

Я использую следующий код

System::Diagnostics::Process^ p = gcnew System::Diagnostics::Process();
p->StartInfo->FileName = "tnccmd.exe";
p->StartInfo->UseShellExecute = false;
p->StartInfo->RedirectStandardInput = true;
p->StartInfo->RedirectStandardOutput = true; 
p->Start();
System::IO::StreamWriter^ tnc_stdin = p->StandardInput;
System::IO::StreamReader^ tnc_stdout = p->StandardOutput;
tnc_stdin->WriteLine("connect i 127.0.0.1");
String^ prg_output = tnc_stdout->*********();

Моя проблема в том, что я не могу правильно читать stdout. Я могу легко написать в stdin, но теперь я пытаюсь реализовать некоторый код проверки ошибок, и он не работает.

Программа, которую я использую, кажется, не пишет в stdout, даже если она выполнена для запуска в командной строке. Я могу воспроизвести bug с ftp.exe, который поставляется с Windows XP по умолчанию. Если вы измените ->FileName на ftp.exe, то командная строка ftp.exe обычно дает ftp> не будет отображаться в prg_output.

Теперь я знаю, что приглашение должно использовать какой-то windows shell curses, и я могу смешивать проблемы.

Нормально сразу после инструкции connect i 127.0.0.1, которую я должен получить connecting to 127.0.0.1..., но я ничего не получаю.

Любой намек на то, что я делаю неправильно? Есть ли другой тип stdout, о котором я не знаю?

ИЗМЕНИТЬ

Я не могу использовать аргументы, потому что у меня есть несколько строк для записи, как и с ftp.exe. Кроме того, ftp.exe выводит, когда вы вводите команды, такие как dir. По крайней мере, он выводится, когда вы пишете неизвестные команды, он жалуется на Invalid command.

4 ответа

См. это сообщение в блоге о захвате как стандартных Out, так и Err из управляемых приложений. CLR делает очень легко сделать не ту вещь и тупик самостоятельно.

Как правильно использовать System.Diagnostics.Process


возможно, это проблема с буферизацией.

Что произойдет, если вы попытаетесь сбросить tnc_stdin? попробуйте что-то вроде этого:

tnc_stdin->WriteLine("connect i 127.0.0.1");
tnc_stdin->Flush();

Изменить: проверено, что вы используете для использования StreamWriter (правила рефлектора!) В соответствии с этим размер буфера по умолчанию составляет 1024 байта... так что вам нужно скрыть:-) или вы можете определить меньший буфер.

public StreamWriter(string path) : 
this(path, false, new UTF8Encoding(false, true), 0x400)
 {
 }


Я думаю, что вы забыли позвонить BeginOutputReadLine


Я подозреваю, что вы пытаетесь отправить на stdin то, что на самом деле должно быть аргументом командной строки. Как вы обычно вызываете tnccmd.exe? Что-то вроде этого?

tnccmd.exe connect i 127.0.0.1

Если это случай, тогда "connect я 127.0.0.1" не должен идти на stdin, но должен быть передан через p- > StartInfo- > Arguments.

(Проблема с ftp.exe не с вашей программой, а скорее с ftp.exe, которая обнаруживает, является ли ее stdout консолью. Если ее вывод не находится на консоли, то он не выводит "ftp > ". Также возможно, что программа, которую вы пытаетесь выполнить script, делает то же самое.)

licensed under cc by-sa 3.0 with attribution.