有没有更好的方法在C ++ / CLI中使用system()重定向stdout?

时间:2011-08-29 18:17:25

标签: c++ c++-cli stdout

在我正在处理的2部分C ++ / CLI代码中,程序需要运行不同的可执行文件并将其STDOUT输出重定向到文件。它以两种不同的方式进行尝试,目前只有两种方式中的一种有效。该程序正在Windows XP上运行。

第一部分组装一个长char *,最终看起来像这样:

char* exepath = "start/B /D\\root\\bin \\root\\bin\\process.exe 1>\\root\\logs\\process_STDOUT.txt"

然后代码只需调用

Status = system(exepath);

这很好用:它都运行process.exe并按预期创建process_STDOUT.txt文件。

第二部分尝试使用ProcessStartInfo对象执行相同操作。它成功启动了process.exe,但尚未创建重定向的输出.txt文件。以下是该代码的简化版本:

 Process p = gcnew Process();
 ProcessStartInfo^ s = gcnew ProcessStartInfo();
 s->FileName         = "\\root\\bin\\process.exe";
 s->WindowStyle      = ProcessWindowStyle::Hidden;
 s->CreateNoWindow   = true;
 s->UseShellExecute  = false;
 s->Arguments        = "1>\\root\\logs\\process_STDOUT.txt";
 p->StartInfo        = s;
 p->Start();

我这个代码做错了吗?如果没有,是回到系统(exepath)我唯一的选择还是还有其他选择?

3 个答案:

答案 0 :(得分:2)

system函数调用系统的命令行解释器,在Windows上通常是 cmd.exe 那是解析I / O重定向语法的程序。你刚开始的课程不知道>意味着什么;它将其解释为实际命令行参数的第一个字符。 (想一想 - 你的命令行程序中编写了命令行重定向代码吗?不,当然不是。的作者也没有process.exe 。)

这就是为什么你的ProcessStartInfo方法不会重定向I / O的原因。为此,请参阅此处有关redirecting stdin and stdout in .Net的问题。

由于您无论如何都要将输出重定向到文件,因此您当前的system代码应该没问题。当您想要在程序中而不是文件中收集输出时,需要采用更加编程的重定向方式。

答案 1 :(得分:1)

查看this文章。值得注意:

/* Setup Redirect */
processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;

/* Capture Output */
StreamWriter inputWriter = process.StandardInput;
StreamReader outputReader = process.StandardOutput;
StreamReader errorReader = process.StandardError;
process.WaitForExit();

传递"1>\\root\\logs\\process_STDOUT.txt"作为参数与重定向

不同

答案 2 :(得分:0)

“管道命令”不作为参数传递给程序; shell解释它并且程序本身不知道它的输出被重定向到文件。因此,您不希望将此类内容作为参数传递。

但是,Program类具有StandardOutputStandardError流属性,可帮助您捕获输出。您只需指定(在ProcessStartInfo对象中)要重定向输出。

s->RedirectStandardOutput = true;
s->RedirectStandardError = true;

在此之后,您将能够使用p->StandardOutputp->StandardError来获取流的输出。