.net - 使用 .net 从子进程重定向标准输出

标签 .net process stdout stdio

我正在使用下面的代码

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

最佳答案

我怀疑您正试图向标准输入发送实际上应该是命令行参数的内容。您通常如何调用 tnccmd.exe?是这样的吗?

tnccmd.exe connect i 127.0.0.1

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

(ftp.exe 的问题不在于你的程序,而在于 ftp.exe 本身,它会检查它的标准输出是否是控制台。如果它的输出不在控制台上,那么它不会输出“ftp>” 提示符。您尝试编写脚本的程序也有可能做同样的事情。)

关于.net - 使用 .net 从子进程重定向标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/318915/

相关文章:

process - 无法通过管道多次传入或传出生成的子进程

python - 如何在 python 2.x 和 3.x 中直接打印到文本文件?

python - 进度条将不需要的字符打印到控制台

c# - 端点 : Syntax in C# - what is this?

.net - 开始一份专注于棕地应用程序重构和敏捷的新工作

.net - 带有 VBA 的 WinSCP .NET 程序集抛出 ActiveX 组件无法创建对象

c# - WCF 中使用 BasicHttpBinding 和 TransportWithMessageCredential 的用户授权

linux - ptrace suid 进程(在它放弃特权之后)

Python脚本嵌入shell脚本,不退出且守护进程解决方案不符合需求

java - 了解tomcat中的类加载和卸载