【问题标题】:Redirect stout from child process with .net使用.net从子进程重定向标准输出
【发布时间】:2008-11-25 21:21:58
【问题描述】:

我正在使用以下代码

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。 此外,ftp.exe 会在您键入 dir 之类的命令时输出。至少当你编写未知命令时它会输出,它会抱怨Invalid command

【问题讨论】:

    标签: .net process stdout stdio


    【解决方案1】:

    我怀疑您正在尝试向标准输入发送实际上应该是命令行参数的内容。您通常如何调用 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>”提示符。您尝试编写脚本的程序也可能执行相同的操作。)

    【讨论】:

      【解决方案2】:

      可能是缓冲的问题。

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

      【讨论】:

      • 感谢您的回答。但是 StreamWriter 确实有效,StreamReader 出现了问题
      【解决方案3】:

      我想你忘了打电话给BeginOutputReadLine

      【讨论】:

        【解决方案4】:

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

        How to use System.Diagnostics.Process correctly

        【讨论】:

          猜你喜欢
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          • 2022-12-14
          • 2023-04-05
          • 2011-01-10
          • 1970-01-01
          • 2016-02-29
          • 1970-01-01
          相关资源
          最近更新 更多