2016-06-27 16 views
5

Windows 10 Konsolenhost, conhost.exe, hat native support for ANSI escape sequences, ältere Versionen nicht. Wie kann das Vorhandensein oder Fehlen von Konsolen-ANSI-Unterstützung aus einer Batch-Datei erkannt werden?ANSI-kompatible Konsole aus Windows-Stapeldatei erkennen?

Ist es möglich, GetConsoleMode oder andere Windows API-Aufrufe direkt aus einer Batchdatei aufzurufen?

+1

Sie benötigen PowerShell, um eine Windows-API aufzurufen, aber Sie können PowerShell aus dem Stapel aufrufen. – SomethingDark

+0

@SomethingDark, können Sie gute Ressourcen zum Aufruf von Windows-APIs von Powershell empfehlen? – jwfearn

+1

Ehrlich gesagt, das einzige Mal, dass ich es jemals tun musste, hatte ich das Glück, nur Fenster zu verschieben und zu skalieren und es gelang mir, vorhandenen Code zu finden, der genau das tat, was ich brauchte, aber ungefähr so: https://blogs.msdn.microsoft.com/mattbie/2010/02/23/how-to-call-net-and-win32-methods-from-powershell-and-your-troubleshooting-packs/ – SomethingDark

Antwort

4

Die Antwort auf Ihre letzte Frage lautet: Ja, mit Hilfe von PowerShell-Code. Diese Batch-Datei zu tun, was Sie angefordert:

@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... 
) 

ich diese Art von Code schrieb die Beispiele in der Powershell-Hilfe auf Add-Type Cmdlets und die Info gegeben in der akzeptierten Antwort auf this question lesen.