使用.net从子进程重定向stout

使用.net从子进程重定向stout,.net,process,stdout,stdio,.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->Redirec

我正在使用以下代码

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
,但现在我正在尝试实现一些错误检查代码,但它不起作用

我正在使用的程序似乎没有写入标准输出,即使它是在命令行中运行的。默认情况下,我可以使用
windowsxp
附带的
ftp.exe
复制
bug
。如果使用
ftp.exe
更改
->FileName
,命令提示符
ftp.exe
通常给出
ftp>
将不会显示在
prg\u输出中

现在我知道提示必须使用某种类型的
windowsshell诅咒
,我可能会混淆问题

正常情况下,就在
connect i 127.0.0.1
指令之后,我应该收到
connecting to 127.0.0.1…
但我什么也没有收到

有没有关于我做错了什么的暗示?有没有另一种我不知道的
stdout

编辑

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

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

tnccmd.exe connect i 127.0.0.1
如果是这种情况,那么“connecti127.0.0.1”不应该出现在stdin上,而是应该通过p->StartInfo->Arguments传递


(ftp.exe的问题不在于您的程序,而在于ftp.exe本身,它会发现其标准输出是否在控制台上。如果其输出不在控制台上,则不会输出“ftp>”提示。您试图编写脚本的程序也可能会做同样的事情。)

可能是缓冲问题

如果你试图冲洗tnc_stdin会发生什么? 试着这样做:

tnc_stdin->WriteLine("connect i 127.0.0.1");
tnc_stdin->Flush();
编辑:选中您正在使用的StreamWriter的ctor(反射器规则!) 根据它,默认的缓冲区大小是1024字节。。。所以你需要冲洗:-) 或者您可以定义一个较小的缓冲区

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

我想你忘了打电话给看这篇关于从托管应用程序捕获标准输出和错误的博文。CLR使您很容易做错误的事情并使自己陷入僵局


谢谢您的回答。无论StreamWriter如何工作,StreamReader都会出现问题