在我正在处理的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)我唯一的选择还是还有其他选择?
答案 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
类具有StandardOutput
和StandardError
流属性,可帮助您捕获输出。您只需指定(在ProcessStartInfo
对象中)要重定向输出。
s->RedirectStandardOutput = true;
s->RedirectStandardError = true;
在此之后,您将能够使用p->StandardOutput
和p->StandardError
来获取流的输出。