When running SQLCMD.exe
, it calls SetConsoleMode
with hard-coded values, overriding any other options that might be enabled in the current console mode, including ENABLE_VIRTUAL_TERMINAL_PROCESSING
which provides support for ANSI escape codes.
The consequence is that after running SQLCMD.exe
, any ANSI output gets written in raw form, as control characters are not parsed for VT100
and similar sequences that control cursor movement, color/font mode, and other operations that can also be performed via the existing Console APIs.
using System;
using System.Diagnostics;
namespace ReproBugSqlCmdDisablesAnsiSupport
{
class Program
{
static void Main(string[] args)
{
// GOOD: This shows in the Console with colors
Console.WriteLine("\u001b[41;1m\u001b[37;1mC. Augusto Proiete\u001b[0m");
Process.Start("sqlcmd", "-???")?.WaitForExit();
// BAD: ANSI support was disabled by SQLCMD and ANSI colors no longer work
Console.WriteLine("\u001b[41;1m\u001b[37;1mC. Augusto Proiete\u001b[0m");
}
}
}
Bug discovered by @nsmithdev via cake-build/cake#3018