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

6

Windows 10控制台主机,conhost.exe,原生支持ANSI转义序列,旧版本不支持。如何从批处理文件中检测控制台ANSI支持的存在或不存在?

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


1
你需要使用PowerShell来调用Windows API,但是你可以从批处理中调用PowerShell。 - SomethingDark
@SomethingDark,你能推荐一些关于如何从Powershell调用Windows API的好资源吗? - jwfearn
1
说实话,我只需要一次移动和调整窗口大小,幸运的是我找到了现有的代码完全符合我的需求,但大概就是这样:https://blogs.msdn.microsoft.com/mattbie/2010/02/23/how-to-call-net-and-win32-methods-from-powershell-and-your-troubleshooting-packs/。 - SomethingDark
@Mofi:那是老旧的巧合编码策略,从来都不会太成功。该功能可能会被回溯到Windows 8,因此现在您的代码无法在Windows 8上运行。而且有SetConsoleMode,所以您不能盲目地假设虚拟终端序列总是在Windows 10上解释。而且你真的不知道在Windows v.Next中虚拟终端序列的调用情况。 - IInspectable
@Mofi:这是一个不幸的决定,因为现在未来的访问者将不再知道曾经考虑过使用VER,但最终被放弃了。使用VER会导致解决方案不够稳健,并且仅仅是巧合起作用。 - IInspectable
1个回答

6
您上一个问题的答案是:是的,可以借助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...
)

我是根据 PowerShell 中 Add-Type 命令的示例和在这个问题的接受答案中给出的信息编写了此类代码。请注意,我保留了 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接