$out = Join-Path $env:TEMP 'console-probe.txt' $lines = New-Object System.Collections.Generic.List[string] function L($s) { $lines.Add($s) } $src = @" using System; using System.Runtime.InteropServices; public static class K32 { [DllImport("kernel32.dll", SetLastError=true)] public static extern bool AllocConsole(); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool FreeConsole(); [DllImport("kernel32.dll")] public static extern IntPtr GetStdHandle(int n); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool GetConsoleMode(IntPtr h, out uint m); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool SetConsoleMode(IntPtr h, uint m); [DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow(); } "@ Add-Type -TypeDefinition $src -ErrorAction Stop $hwndBefore = [K32]::GetConsoleWindow() L ("PSVersion : " + $PSVersionTable.PSVersion) L ("CLR : " + [System.Environment]::Version) L ("GetConsoleWindow(before AllocConsole) : " + $hwndBefore) $ok = [K32]::AllocConsole() L ("AllocConsole() : " + $ok) $hOut = [K32]::GetStdHandle(-11); $hIn = [K32]::GetStdHandle(-10) $mOut = 0; $mIn = 0 $okOut = [K32]::GetConsoleMode($hOut, [ref]$mOut) $okIn = [K32]::GetConsoleMode($hIn, [ref]$mIn) L ("STDOUT GetConsoleMode: " + $okOut + " mode=0x" + ('{0:X}' -f $mOut)) L ("STDIN GetConsoleMode: " + $okIn + " mode=0x" + ('{0:X}' -f $mIn)) L (" STDOUT ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004) : " + (($mOut -band 4) -eq 4)) L (" STDOUT ENABLE_PROCESSED_OUTPUT (0x0001) : " + (($mOut -band 1) -eq 1)) L (" STDOUT ENABLE_WRAP_AT_EOL_OUTPUT (0x0002) : " + (($mOut -band 2) -eq 2)) L (" STDIN ENABLE_VIRTUAL_TERMINAL_INPUT (0x0200) : " + (($mIn -band 0x200) -eq 0x200)) $raw = $Host.UI.RawUI $vtProp = $raw | Get-Member -Name SupportsVirtualTerminal -ErrorAction SilentlyContinue $rawMembers = ($raw | Get-Member -MemberType Property | Select-Object -ExpandProperty Name) -join ',' L ("RawUI property list : " + $rawMembers) L ("RawUI has SupportsVirtualTerminal member? " + [bool]$vtProp) try { L ("RawUI.SupportsVirtualTerminal value : [" + $raw.SupportsVirtualTerminal + "]") } catch { L ("RawUI.SupportsVirtualTerminal THREW: " + $_.Exception.Message) } try { L ("`$Host.UI.SupportsVirtualTerminal : [" + $Host.UI.SupportsVirtualTerminal + "]") } catch { L ("`$Host.UI.SupportsVirtualTerminal THREW: " + $_.Exception.Message) } L ("[Console]::OutputEncoding : " + [Console]::OutputEncoding.WebName) L ("[Console]::IsOutputRedirected : " + [Console]::IsOutputRedirected) L ("[Console] ReinitCheck : skipped") $w = $raw.WindowSize; $b = $raw.BufferSize L ("RawUI.WindowSize : " + $w.Width + "x" + $w.Height) L ("RawUI.BufferSize : " + $b.Width + "x" + $b.Height) # activate VT and re-read $okSet = [K32]::SetConsoleMode($hOut, $mOut -bor 4) $mOut2 = 0 [void][K32]::GetConsoleMode($hOut, [ref]$mOut2) L ("SetConsoleMode(out, mode|0x4) : " + $okSet + " -> new mode=0x" + ('{0:X}' -f $mOut2)) $tmp = join-path $env:TEMP 'vt-write-test.txt' $lines | Set-Content -Path $tmp -Encoding UTF8 Write-Host "" Write-Host "=== PROBE OUTPUT ON ATTACHED CONSOLE ===" -ForegroundColor Cyan Write-Host "Try ANSI: [31mRED[0m [32mGREEN[0m" $lines | ForEach-Object { Write-Host $_ } Write-Host "=== END ===" -ForegroundColor Cyan Start-Sleep -Seconds 2 [void][K32]::FreeConsole()