C++ 运行批处理文件而不重定向输出

Posted

技术标签:

【中文标题】C++ 运行批处理文件而不重定向输出【英文标题】:C++ Run Batch File Without Redirecting Output 【发布时间】:2015-07-22 10:12:26 【问题描述】:
tempString = (string("cmd.exe /C \"") + tempString + "\"");

STARTUPINFO si =  sizeof(STARTUPINFO) ;

PROCESS_INFORMATION pi;

CreateProcess(NULL, (LPSTR)tempString.c_str(), 0, 0, FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, 0, &si, &pi);

我正在通过 dll 从另一个进程中启动批处理脚本。 问题是进程正在显示:

error : 不支持输入重定向,退出进程 马上。

如何启动一个批处理脚本,使其独立于调用进程(被调用者关闭时不会关闭),并且不在调用进程的控制台中输出?

【问题讨论】:

见this answer @wOxxOm DETATCH_PROCESS 不起作用,但我阅读了其他可用的标志,并且 CREATE_NEW_CONSOLE 在我的情况下确实有效,谢谢。 如果您将您的发现添加为答案并接受它,那就太好了。 【参考方案1】:

如果你不想在执行命令字符串时显示控制台窗口,你可以这样做:

tempString = (string(" /C \"") + tempString + "\"");
ShellExecute(NULL, NULL, "cmd.exe", tempString.c_str(), NULL, SW_HIDE);

【讨论】:

WinExec 很久以前就被弃用了,不应使用。它的存在只是为了兼容 16 位应用程序。 感谢回复,我忘记了 WinExec API 已弃用,我修改了答案。 我的问题不是隐藏窗口,而是防止输出重定向。【参考方案2】:

CREATE_NEW_CONSOLE 标志分配一个新的控制台供进程使用,这样它就不会使用与调用进程相同的标准输出。

【讨论】:

以上是关于C++ 运行批处理文件而不重定向输出的主要内容,如果未能解决你的问题,请参考以下文章

将 Visual C++ 控制台输出复制(不重定向)到文本文件,同时仍在控制台窗口中查看输出

为啥下面的系统调用输出不重定向到文件?

运行时的 exec() 方法不重定向输出

将非 bat 扩展文件作为批处理文件运行

apache中的vhost重写规则-摆脱子域而不重定向

下载 iOS 应用程序而不重定向到 App Store