2008-11-25 2 views
2

Я использую следующий кодПеренаправление стаут ​​от дочернего процесса с .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->ReadToEnd(); 

Моя проблема заключается в том, что я не могу читать 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, о котором я не знаю?

EDIT

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

ответ

0

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

tnccmd.exe connect i 127.0.0.1 

Если это так, то «подключить я 127.0.0.1» не должен идти на стандартный ввод, но должны быть переданы через p-> StartInfo-> Аргументы.

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

0

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

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

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

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

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

Благодарим за ответ. Однако StreamWriter действительно работает, проблема возникает с StreamReader – Eric 2008-11-25 21:44:33

0

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

How to use System.Diagnostics.Process correctly

Смежные вопросы