2016-06-27 13 views
5

L'host di Windows 10 console, conhost.exe, ha native support for ANSI escape sequences, le versioni precedenti no. Come si può rilevare la presenza o l'assenza del supporto ANSI della console da un file batch?Rileva la console compatibile ANSI dal file batch di Windows?

È possibile chiamare GetConsoleMode o altre chiamate API Windows direttamente da un file batch?

+1

È necessario PowerShell per chiamare un'API di Windows, ma è possibile chiamare PowerShell dal batch. – SomethingDark

+0

@SomethingDark, puoi consigliare qualche buona risorsa su come chiamare le API di Windows da Powershell? – jwfearn

+1

Onestamente, l'unica volta che ho avuto bisogno di farlo, ho avuto la fortuna di dover solo spostare e ridimensionare le finestre e sono riuscito a trovare il codice esistente che ha fatto esattamente quello di cui avevo bisogno, ma è qualcosa del genere: https://blogs.msdn.microsoft.com/mattbie/2010/02/23/how-to-call-net-and-win32-methods-from-powershell-and-your-troubleshooting-packs/ – SomethingDark

risposta

4

La risposta alla tua ultima domanda è: Sì, con l'aiuto del codice PowerShell. Questo file batch fare ciò che avete richiesto:

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

Ho scritto questo tipo di codice di lettura degli esempi in aiuto PowerShell Add-Type cmdlet e le informazioni fornite nella risposta accettata a this question.

Problemi correlati