使用.NET重定向子进程的标准输出

3
我正在使用以下代码。
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。我可以使用默认情况下随Windows XP提供的ftp.exe重现此bug。如果将-> 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确实会输出。至少当您写入未知命令时,它会抱怨“无效的命令”。
4个回答

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>"提示符。您尝试脚本化的程序也可能会做同样的事情。)

0

0

0

可能是缓冲区的问题。

如果尝试刷新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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接