重定向粗壮使用.NET

问题描述:

我用下面的代码重定向粗壮使用.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。我可以使用ftp.exe重现bug,默认情况下它带有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很像。 另外,输入命令如dir时,ftp.exe会输出。至少在你写出未知命令时输出,它会抱怨Invalid command

我怀疑你试图发送给stdin,实际上应该是一个命令行参数。你通常会如何调用tnccmd.exe?像这样?

tnccmd.exe connect i 127.0.0.1 

如果是这样的话,那么“连接​​我127.0.0.1”不应在标准输入去,但应该通过P-> StartInfo->参数传递。 (ftp.exe的问题不在你的程序中,而是ftp.exe本身,它发现它的stdout是否是控制台,如果它的输出不在控制台上,那么它不会输出“ftp>”提示符,也可能是你要编写脚本的程序做同样的事情。)

也许这是一个缓冲问题。

如果您尝试刷新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) 
    { 
    } 
+0

谢谢你的回答。 但是StreamWriter确实有效,StreamReader出现问题 – Eric 2008-11-25 21:44:33

我认为你忘了打电话给BeginOutputReadLine

查看有关通过管理应用程序捕获了标准输出和错误这篇博客文章。 CLR很容易做错你自己和僵局。

How to use System.Diagnostics.Process correctly