【问题标题】:Detect ANSI-compatible console from Windows batch file?从 Windows 批处理文件中检测 ANSI 兼容的控制台?
【发布时间】:2016-10-28 22:15:39
【问题描述】:

Windows 10 控制台主机 conhost.exe 具有 native support for ANSI escape sequences,旧版本没有。如何从批处理文件中检测是否存在控制台 ANSI 支持?

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

【问题讨论】:

  • 调用Windows API需要PowerShell,但可以批量调用PowerShell。
  • @SomethingDark,你能推荐一些关于如何从 Powershell 调用 Windows API 的好资源吗?
  • 老实说,有一次我需要这样做,我很幸运只需要移动和调整窗口大小,并且我设法找到了完全符合我需要的现有代码,但它是像这样:blogs.msdn.microsoft.com/mattbie/2010/02/23/…
  • @Mofi:这是旧的巧合代码策略,永远不会奏效。该功能可能会被向后移植到 Windows 8,因此现在您的代码无法在 Windows 8 上运行。还有SetConsoleMode,因此您不能盲目假设虚拟终端序列总是在 Windows 10 上解释。而且您真的不知道Windows v.Next 中对虚拟终端序列的调用是什么。
  • @Mofi:这是一个不幸的决定,因为现在未来的访问者将不再知道,使用 VER 已被考虑,但被解雇了。使用 VER 会导致解决方案不够稳健,而且只是巧合。

标签: windows batch-file ansi-escape


【解决方案1】:

最后一个问题的答案是:是的,借助 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...
)

我编写了此类代码,阅读了有关 Add-Type cmdlet 的 PowerShell 帮助中的示例以及this question 接受的答案中给出的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2013-12-11
    • 2021-01-09
    • 2014-08-11
    • 2015-01-28
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多