cmd.exe / ConPTY — ANSI escape code support
cmd.exe is the legacy Windows Command Processor shipping in every release since Windows NT 3.1 (1993). It's a shell, not a terminal — when you launch it, Windows hands its stdio to a console host that does the actual rendering: conhost.exe on Windows 10 and earlier, ConPTY (the in-kernel pseudo-console) on Windows 10 1809+ and Windows 11. The historical gap most developers hit is ANSI escape parsing: vintage conhost.exe ignored \x1b[31m and rendered the bytes as literal text. The fix landed in Windows 10 1511 (Nov 2015) behind an opt-in ENABLE_VIRTUAL_TERMINAL_PROCESSING flag passed to SetConsoleMode, became the default for most apps in Windows 10 1709 (Oct 2017), and was rebuilt around ConPTY in 1809 (Oct 2018) so that legacy Win32 console API calls (SetConsoleTextAttribute, WriteConsoleW) are now translated *into* VT bytes on the way out.
In 2026 practice: every supported Windows version parses xterm-ctlseqs by default. The remaining cmd-specific quirks are the BAT-file $E prompt syntax for embedding ESC, the chcp 65001 codepage incantation needed for non-ASCII text, and the ConPTY translation lossiness — Win32-console-only apps don't always survive the round-trip cleanly. cmd.exe itself emits nothing on its own; everything you see colourised in a cmd window came from a child process via VT bytes.
Last updated
Feature support
How this terminal scores against the 15 features tracked in the site-wide support matrix. Click any feature name to see the full row across every terminal.
- 8 basic colors (30–37 / 40–47)SGR 30–37 foreground, 40–47 background.yes
- Bright (aixterm) colors (90–97 / 100–107)aixterm SGR extension.yes
- 256-color palette (38;5;n / 48;5;n)xterm 256-color extension.partial
- 24-bit truecolor (38;2;r;g;b)16.7M direct RGB. Set $COLORTERM=truecolor.partial
- Italic (SGR 3)Italic text attribute.no
- Styled underlines (4:1–4:5)Curly/dotted/dashed underline styles.no
- Strikethrough (SGR 9)Horizontal line through text.no
- OSC 8 hyperlinksInline clickable URIs.no
- Alt screen (?1049h)Full-screen app buffer.partial
- Mouse tracking (SGR ?1006)Mouse click/drag events.partial
- Bracketed paste (?2004)Pasted text wrapped in ESC[200~/ESC[201~.yes
- Focus events (?1004)ESC[I on focus in, ESC[O on focus out.no
- Sixel graphicsDEC sixel inline raster images.no
- Kitty graphics protocolPNG/RGB inline images, animations.no
- Synchronized output (?2026)Atomic frame updates to avoid tearing.no
Sequences that work here
Canonical reference pages for the escape sequences this terminal handles cleanly. Each links to a full page with byte forms, citations, and per-language examples.
- SGR 0 — Reset / Normal
\x1b[0mClear all text attributes and colors back to the terminal default.
- SGR 30–37 — Foreground color (8 basic)
\x1b[31m (red, similarly 30–37)Set foreground to one of black/red/green/yellow/blue/magenta/cyan/white.
- SGR 38;2;R;G;B — 24-bit truecolor foreground
\x1b[38;2;R;G;BmPick any of 16,777,216 foreground RGB colors directly.
- CUP — Set cursor position
\x1b[row;colHMove the cursor to absolute row/column (1-indexed).
- ED — Erase in display (\x1b[2J clear screen)
\x1b[NJErase part or all of the screen.
Quirks & version notes
Per-terminal caveats you'll want to know before relying on a sequence in production.
- ENABLE_VIRTUAL_TERMINAL_PROCESSING — the legacy opt-in flag
- Before 1709, console apps had to opt in to VT parsing by calling
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT). Python'scolorama.just_fix_windows_console()(since v0.4.6) andpwsh.exe's prompt setup do this for you; rawpython.exe/node.exe/go runon 1809+ get VT enabled implicitly because ConPTY is in the pipeline. Bare C:#include <windows.h>+SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), 0x0001 | 0x0004). PowerShell:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8+ nothing else needed. If you're shipping a CLI that must work on Win7 / Server 2008 R2, fall back to thecolorama-style Win32-API path. - ConPTY translation is lossy — Win32-console quirks survive
- Since 1809, every cmd window is fronted by ConPTY: it owns a screen buffer, runs the parser, and emits VT bytes upstream. Legacy programs that still call
WriteConsoleOutputor query screen-buffer state throughGetConsoleScreenBufferInfowork by ConPTY synthesising responses. Two known lossy cases: (1)WriteConsoleOutputwith non-default attributes is approximated to the nearest VT SGR — sub-cell precision is dropped; (2) bracketed-paste mode bytes can leak into apps that didn't request them, because ConPTY can't tell which child process expects which DEC private mode (microsoft/terminal#3866). Workaround: detect ConPTY viaIsConsoleHandle + GetConsoleModereturningENABLE_VIRTUAL_TERMINAL_INPUTand emit only modern VT. prompt $E[1;31m…$E[0m— embedding ESC in cmd.exe prompts- cmd.exe's
promptbuiltin expands$Eto a literal\x1bbyte, soprompt $E[1;31m$P$E[0m$Gpaints the working-directory prompt red. Set it permanently viasetx PROMPT "$E[1;31m$P$E[0m$G". In BAT scripts you can also usefor /F %%a in ('echo prompt $E ^| cmd') do set ESC=%%ato capture an ESC byte into a variable. Modern PowerShell users use$PSStyle.Foreground.Redinstead; cmd users have no native colour API, only this prompt-substitution trick. chcp 65001for UTF-8 — and the EOF gotcha- cmd.exe defaults to the OEM codepage (cp437 in US English locale), so emoji and most non-ASCII text in coloured output render as mojibake.
chcp 65001switches the active codepage to UTF-8; persist it withsetx /M PYTHONUTF8 1(Python) or viaSettings → Time & Language → Language & Region → Administrative language settings → Change system locale → Beta: Use Unicode UTF-8(Windows 10 1903+, machine-wide). The historical EOF gotcha: under cp65001 some C runtime versions read EOF prematurely ongetchar()— fixed in MSVC v142+ but still bites mingw-built binaries. SGR escape bytes themselves are codepage-insensitive (they're ASCII), so colour works on any codepage. - Truecolor: yes since 1709, but conhost.exe quantizes to 16
- Windows 10 1709+ parses
\x1b[38;2;R;G;Bmtruecolor SGR. In Windows Terminal you get the actual 24-bit pixel; in legacy conhost.exe (the host you see when you launch cmd directly fromC:\Windows\System32\cmd.exe, not viawt.exe) the truecolor value is quantized to the nearest of 16 console-palette colours. Apps that care should query$COLORTERM=truecolor(Windows Terminal sets it; conhost.exe doesn't) or — better — emit 256-indexed colour as the safer baseline. ConPTY on 1809+ passes the truecolor bytes through unchanged; the quantisation happens at the rendering layer above, not in the parser. - $TERM is unset — detect via
OS=Windows_NT - cmd.exe doesn't set
$TERM— terminfo-based detection (tput colors,infocmp) silently fails. Instead, cross-platform CLIs checkprocess.platform === 'win32'(Node),os.name === 'nt'(Python),runtime.GOOS === "windows"(Go),cfg!(windows)(Rust). For finer-grained "running under Windows Terminal vs raw conhost" detection, look at$WT_SESSION(set by Windows Terminal only) or$TERM_PROGRAM=Windows_Terminal. Bare cmd / conhost has neither, justOS=Windows_NT. Inside WSL the picture flips: there$TERMis set normally by the Linux shell and the Windows host is invisible.