function Test-TerminalSupportsANSIEscapes { <# .SYNOPSIS Test if the terminal being used supports ANSI escape sequences This matters if we want to avoid spamming characters at the console when they don't benefit us. #> [CmdletBinding()] [OutputType([bool])] param ( ) # Implement a runtime caching strategy so we don't keep asking the OS if ($script:Test_TerminalSupportsANSIEscapes_set -eq $true) { return $script:Test_TerminalSupportsANSIEscapes } # Support and honor the request for no-color on output # https://no-color.org/ if ($null -ne (Get-EnvironmentVariable 'NO_COLOR' 6>$null 5>$null 4>$null 3>$null)) { $script:Test_TerminalSupportsANSIEscapes_set = $true $script:Test_TerminalSupportsANSIEscapes = $false return $false } # Start with a testable variable, default to int32->0 $mode = 0 # Import some headers so we can call the DLLs directly $MethodDefinitions = @' [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); '@ # Get a type library we can play with $Kernel32 = Add-Type -MemberDefinition $MethodDefinitions -Name 'Kernel32' -Namespace 'Win32' -PassThru # Ask the std_output handle if it knows what mode we are $hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE if ($Kernel32::GetConsoleMode($hConsoleHandle, [ref]$mode)) { # We were able to read the value from the std_output handle $script:Test_TerminalSupportsANSIEscapes_set = $true $script:Test_TerminalSupportsANSIEscapes = ($mode -ne 0) return $script:Test_TerminalSupportsANSIEscapes } else { # We could not read the value, so assume false $script:Test_TerminalSupportsANSIEscapes_set = $true $script:Test_TerminalSupportsANSIEscapes = $false return $false } }