gpt4 book ai didi

powershell - 在PowerShell控制台中使用ANSI/VT100代码输出彩色文本

转载 作者:行者123 更新时间:2023-12-03 21:03:58 30 4
gpt4 key购买 nike

我编写了一个程序,该程序打印一个字符串,其中包含ANSI escape sequences以使文本变色。但是,如屏幕截图所示,它在默认的Windows 10控制台中无法正常工作。

程序输出与转义序列一起显示为打印字符。
如果我通过变量或管道将该字符串提供给PowerShell,则输出将按预期显示(红色文本)。

如何实现程序打印彩色文本而没有任何解决方法?

enter image description here

这是我的程序源(Haskell)-但是语言无关,只是您可以看到转义序列的编写方式。

main = do
let red = "\ESC[31m"
let reset = "\ESC[39m"
putStrLn $ red ++ "RED" ++ reset

最佳答案

虽然Windows 10中的控制台窗口原则上确实支持VT(虚拟终端)/ ANSI转义序列,但默认情况下关闭了支持。

您有三种选择:

  • (a)默认情况下,通过注册表全局激活持久支持,如this SU answer中所述。
  • 简而言之:在注册表项[HKEY_CURRENT_USER\Console]中,将VirtualTerminalLevel DWORD值创建或设置为1
  • 在PowerShell中,您可以通过编程方式执行以下操作:Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1
  • cmd.exe(也可以在PowerShell中使用):reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1
  • 打开一个新的控制台窗口,以使更改生效。
  • 请参阅以下警告。
  • (b)通过调用SetConsoleMode() Windows API函数,从程序内部激活对该程序(进程)的仅支持。
  • 请参阅下面的详细信息。
  • (c),临时解决方法,来自PowerShell :将外部程序的输出通过管道传递给Out-Host;例如.\test.exe | Out-Host
  • 请参阅下面的详细信息。


  • 回复(a):

    基于注册表的方法始终会全局激活VT支持,即为所有控制台窗口激活,而不管其中运行什么shell /程序:
  • 如果需要,各个可执行文件/ shell仍可以使用方法(b)取消对自身的支持。
  • 相反,这意味着任何未明确控制VT支持的程序的输出将受VT序列的解释;尽管通常这是理想的,但假设这可能导致对程序输出的错误解释,而这些程序会意外地产生类似VT的序列的输出。

  • 注意:
  • 虽然有一种机制允许控制台窗口设置受启动可执行文件/窗口标题的限制,但通过[HKEY_CURRENT_USR\Console]的子项,似乎那里不支持VirtualTerminalLevel值。
  • 即使是,但这也不是一个可靠的解决方案,因为通过快捷方式文件(*.lnk)(例如从“开始”菜单或任务栏)打开控制台窗口不会遵循这些设置,因为*.lnk文件具有设置内置于其中;虽然您可以通过Properties GUI对话框修改这些内置设置,但在撰写本文时,该GUI尚未显示VirtualTerminalLevel设置。


  • 回复(b):

    here所述,从程序(进程)内部调用SetConsoleMode() Windows API函数,即使在C#中也很麻烦(由于需要P / Invoke声明),而可能不是选项:
  • 用于不支持使用调用Windows API的语言编写的程序。
  • (如果您具有无法修改的预先存在的可执行文件)。

  • 如果您不想在这种情况下启用全局支持(选项(a)),则选项(c)(来自PowerShell)可能适合您。

    回复(c):

    PowerShell在启动时会自动为其自身的激活VT(虚拟终端)支持(在Windows 10的最新版本中,这同时适用于Windows PowerShell和PowerShell Core)。

    因此,如果通过PowerShell中继外部程序的输出,则为,则将VT序列识别为;使用 Out-Host 是最简单的方法(Write-Host也可以):
    .\t.exe | Out-Host

    注意:仅当您打算打印到控制台时才使用Out-Host;相反,如果您要捕获外部程序的输出,则仅使用$capturedOutput = .\test.exe
    字符编码警告:默认情况下,Windows PowerShell期望外部程序的输出使用OEM代码页,该页由旧版系统区域设置(例如,美式英语系统上的437)定义并反射(reflect)在[console]::OutputEncoding中。
    .NET控制台程序会自动遵守该设置,但是对于使用不同编码(并且不仅产生纯ASCII输出(在7位范围内)的非.NET程序(例如Python脚本)),您必须(至少暂时)通过分配给[console]::OutputEncoding来指定编码;例如,对于UTF-8:[console]::OutputEncoding = [Text.Encoding]::Utf8
    请注意,不仅对于VT序列解决方法是必需的,而且对于PowerShell正确地正确呈现非ASCII字符来说通常也是必需的。

    不幸的是,从v6.1.0-preview.4开始,PowerShell Core仍仍默认为OEM代码页,但默认为should be considered a bug,因为PowerShell Core否则默认为不带BOM的UTF-8。

    关于powershell - 在PowerShell控制台中使用ANSI/VT100代码输出彩色文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51680709/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com