通过 msbuild exec 以C++格式的调色台输出

Color console output in C++ via msbuild exec

本文关键字:输出 格式 msbuild exec C++ 通过      更新时间:2023-10-16

>问题

我很容易找到一种使用 windows.h 和 std::cout 在C++中设置控制台颜色的方法。 下面显示了一种方法:

HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE); //get handle of console
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(stdout, &bufferInfo); //save current color scheme
SetConsoleTextAttribute(stdout, 0x4); //change console color
std::cout << "This is red text" << std::endl; 
SetConsoleTextAttribute(stdout, bufferInfo.wAttributes); //restore old colors

果然,当我从控制台窗口运行程序时,颜色会按预期更改。 问题是,当它从 msbuild 脚本运行时,我使用 exec:

<Exec Command="myExecutable.exe" />

从 msbuild 脚本运行时,颜色不受程序的影响。 文本仍然在调用 std::cout 时输出,但它只是正常的控制台窗口颜色。


假设

我的猜测是,对 exec 的调用通过与 STD_OUTPUT_HANDLE 不同的句柄写入 stdout。 要么,要么 msbuild exec 设置自己的控制台属性。 我尝试过获取父控制台,但没有任何运气。

有什么想法吗?

最有可能的事情是 MSBuild 将可执行文件连接到管道。当您将某些内容写入管道时,MSBuild 从另一端读取它,然后它可能会执行一些处理:例如写入屏幕、日志等......问题是您无法通过管道传输颜色。实际上,您可以使用GetFileType检查stdout句柄是否不是控制台缓冲区,这将返回控制台的FILE_TYPE_CHAR,但FILE_TYPE_PIPE我的假设是否正确。还应检查控制台函数调用是否成功。