2016-06-27 11 views
5

Host konsoli Windows 10, conhost.exe, ma native support for ANSI escape sequences, starsze wersje nie. W jaki sposób można wykryć obecność lub brak obsługi interfejsu ANSI konsoli z pliku wsadowego?Wykryj konsolę zgodną z ANSI z pliku wsadowego Windows?

Czy można wywołać GetConsoleMode lub inne wywołania interfejsu Windows API bezpośrednio z pliku wsadowego?

+1

Potrzebujesz PowerShell, aby wywołać interfejs API systemu Windows, ale możesz wywołać PowerShell z partii. – SomethingDark

+0

@SomethingDark, czy możesz polecić jakieś dobre zasoby dotyczące wywoływania interfejsów API Windows z Powershell? – jwfearn

+1

Szczerze mówiąc, gdy tylko musiałem to zrobić, miałem szczęście, że wystarczy przenieść i zmienić rozmiar okien. Udało mi się znaleźć istniejący kod, który zrobił dokładnie to, czego potrzebowałem, ale jest to coś takiego: https://blogs.msdn.microsoft.com/mattbie/2010/02/23/how-to-call-net-and-win32-methods- from-powershell-and-your-troubleshooting-packs/ – SomethingDark

Odpowiedz

4

Odpowiedź na ostatnie pytanie brzmi: Tak, za pomocą kodu PowerShell. Ten plik wsadowy zrobić co prosiłeś:

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

napisałem tego typu odczyt kodów przykłady przy pomocy PowerShell Add-Type cmdlet i informacji podanych w akceptowanych odpowiedź na this question.

Powiązane problemy