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.
È necessario PowerShell per chiamare un'API di Windows, ma è possibile chiamare PowerShell dal batch. – SomethingDark
@SomethingDark, puoi consigliare qualche buona risorsa su come chiamare le API di Windows da Powershell? – jwfearn
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