我正在使用以下代码
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
。
答案 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使得做错事很容易并且自己陷入僵局。