使用.net重定向来自子进程的stdout

时间:2008-11-25 21:21:58

标签: .net process stdout stdio

我正在使用以下代码

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,我可能会混淆问题。

Normaly就在connect i 127.0.0.1指令后,我应该收到connecting to 127.0.0.1...,但我什么也没收到。

对我做错了什么的暗示?还有其他一种我不知道的stdout吗?

修改

我不能使用参数,因为我有多行要写,就像ftp.exe一样。 此外,当您键入dir等命令时,ftp.exe会输出。至少它在您编写未知命令时输出,它会抱怨Invalid command

4 个答案:

答案 0 :(得分:0)

我怀疑你正试图向stdin发送实际上应该是命令行参数的内容。您通常如何调用tnccmd.exe?像这样的东西?

tnccmd.exe connect i 127.0.0.1

如果是这种情况,那么“connect i 127.0.0.1”不应该继续使用stdin,而应该通过p-> StartInfo-> Arguments传递。

(ftp.exe的问题不是你的程序,而是ftp.exe本身,它会发现它的stdout是否是控制台。如果它的输出不在控制台上,那么它不会输出“ ftp>“提示。你尝试编写脚本的程序也可能做同样的事情。”

答案 1 :(得分:0)

也许是缓冲问题。

如果您尝试刷新tnc_stdin会发生什么? 尝试这样的事情:

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

编辑:检查您正在使用的StreamWriter的ctor(Reflector规则!) 根据它,默认缓冲区大小是1024字节...所以你需要刷新:-) 或者你可以定义一个较小的缓冲区。

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

答案 2 :(得分:0)

我认为您忘了拨打BeginOutputReadLine

答案 3 :(得分:0)

请参阅此博客文章,了解如何从托管应用程序中捕获标准Out和Err。 CLR使得做错事很容易并且自己陷入僵局。

How to use System.Diagnostics.Process correctly