You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10 PowerShell中C语言打印彩色文本异常求助

Windows 10 PowerShell中直接执行C程序不显示ANSI彩色文本,但通过system()调用却正常的原因与解决方法

问题描述

编写了一段C语言代码尝试打印彩色文本:

#include <stdio.h>
int main()
{
    printf("\033[1;32m sample.");
    return 0;
}

在Windows 10 PowerShell中直接编译并执行:

gcc sample.c -o sample.exe
.\sample.exe

输出并非彩色文本,而是原样显示转义序列:

←[1;32m sample.

但通过另一段调用system()的C代码编译执行时,彩色文本能正常显示:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    system("gcc sample.c -o sample.exe");
    system(".\\sample.exe");
    return 0;
}

原因分析

  • PowerShell默认不解析ANSI转义序列:直接在PowerShell中执行.exe文件时,程序输出的ANSI转义序列会被原样输出,不会被解析为彩色格式,这是PowerShell默认配置导致的。
  • system()依赖cmd.exe处理转义:Windows平台下system()函数默认调用cmd.exe执行命令,而Windows 10的cmd.exe已默认支持ANSI转义序列解析,因此通过这种方式执行时,转义序列能被正确处理,显示彩色文本。

解决方法

1. 开启PowerShell的ANSI转义支持

在PowerShell中执行以下命令修改注册表配置,开启虚拟终端处理:

Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1

关闭并重新打开PowerShell后,直接执行编译后的.exe文件即可显示彩色文本。

2. 在C代码中主动启用虚拟终端模式

通过Windows API强制开启控制台的虚拟终端处理功能,让程序在任何终端环境下都能解析ANSI转义序列:

#include <stdio.h>
#include <windows.h>

int main()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hStdOut != INVALID_HANDLE_VALUE)
    {
        DWORD consoleMode;
        GetConsoleMode(hStdOut, &consoleMode);
        // 启用虚拟终端处理
        SetConsoleMode(hStdOut, consoleMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
    }

    printf("\033[1;32m sample.\n");
    return 0;
}

编译后直接执行该程序,无论在PowerShell还是cmd中都能正常显示彩色文本。

3. 通过cmd.exe间接执行程序

如果不想修改代码或配置PowerShell,可在PowerShell中通过cmd调用程序:

cmd /c .\sample.exe

内容的提问来源于stack exchange,提问作者squanchy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:30:08