重定向粗壮使用.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)
{
}
谢谢你的回答。 但是StreamWriter确实有效,StreamReader出现问题 – Eric 2008-11-25 21:44:33