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即使它是在命令行中运行的。我可以重现默认情况下bug附带ftp.exe的。Windows XP如果->FileNameftp.exe命令提示符更改ftp.exe通常给出的ftp>将不会显示在prg_output.

现在我知道提示必须使用某种类型,windows shell curses我可能会混淆问题。

connect i 127.0.0.1通常在我应该收到的指令之后,connecting to 127.0.0.1...但我什么也没收到。

关于我做错了什么的任何提示?还有另一种stdout我不知道的吗?

编辑

我不能使用参数,因为我有多行要写,就像ftp.exe. 此外,ftp.exe当您键入 dir 之类的命令时会输出。至少当您编写未知命令时它会输出,它会抱怨Invalid command.

4

4 回答 4

0

我怀疑您正在尝试将实际上应该是命令行参数的内容发送到标准输入。您通常如何调用 tnccmd.exe?像这样的东西?

tnccmd.exe connect i 127.0.0.1

如果是这种情况,那么“connect i 127.0.0.1”不应在标准输入上继续,而应通过 p->StartInfo->Arguments 传递。

(ftp.exe 的问题不在于你的程序,而在于 ftp.exe 本身,它会判断它的 stdout 是否是控制台。如果它的输出不在控制台上,那么它不会输出“ftp>”提示。您尝试编写脚本的程序也可能执行相同的操作。)

于 2008-11-25T21:31:15.407 回答
0

也许这是缓冲的问题。

如果您尝试刷新 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)
    {
    }
于 2008-11-25T21:31:16.890 回答
0

我认为您忘记调用BeginOutputReadLine

于 2009-04-10T18:23:09.963 回答
0

请参阅这篇关于从托管应用程序中捕获标准 Out 和 Err 的博客文章。CLR 使得自己很容易做错事并陷入僵局。

如何正确使用 System.Diagnostics.Process

于 2013-09-05T22:39:45.743 回答