从Windows批处理文件中检测ANSI兼容的控制台?

jwf*_*arn 5 windows batch-file ansi-escape

Windows 10控制台主机对ANSI转义序列conhost.exe具有本机支持,旧版本则不支持.如何从批处理文件中检测是否存在控制台ANSI支持?

是否可以GetConsoleMode直接从批处理文件中调用或其他Windows API调用?

Aac*_*ini 5

您最后一个问题的答案是:是的,借助 PowerShell 代码。此批处理文件执行您的要求:

@echo off
setlocal

set /A STD_OUTPUT_HANDLE=-11
set /A ENABLE_PROCESSED_OUTPUT=1, ENABLE_WRAP_AT_EOL_OUTPUT=2, ENABLE_VIRTUAL_TERMINAL_PROCESSING=4

PowerShell  ^
   $GetStdHandle = Add-Type 'A' -PassThru -MemberDefinition '  ^
      [DllImport(\"Kernel32.dll\")]  ^
      public static extern IntPtr GetStdHandle(int nStdHandle);  ^
   ';  ^
   $GetConsoleMode = Add-Type 'B' -PassThru -MemberDefinition '  ^
      [DllImport(\"Kernel32.dll\")]  ^
      public static extern bool GetConsoleMode(IntPtr hWnd, ref UInt32 lpMode);  ^
   ';  ^
   $StdoutHandle = $GetStdHandle::GetStdHandle(%STD_OUTPUT_HANDLE%);  ^
   $ConsoleMode = New-Object -TypeName UInt32;  ^
   $null = $GetConsoleMode::GetConsoleMode($StdoutHandle,[ref]$ConsoleMode);  ^
   Set-Content ConsoleMode.txt $ConsoleMode  ^
%End PowerShell%

set /P "ConsoleMode=" < ConsoleMode.txt
set /A "AnsiCompatible=ConsoleMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING"
if %AnsiCompatible% neq 0 (
   echo The console is Ansi-compatible!
) else (
   echo Ansi codes not supported...
)
Run Code Online (Sandbox Code Playgroud)

我编写了这种类型的代码,阅读 PowerShell 帮助中关于 Add-Type cmdlet 的示例以及此问题的已接受答案中给出的信息。