Public/Output/Write-RGB.ps1

function Write-RGB {
  # .SYNOPSIS
  # Write to the console in 24-bit colors!
  # .DESCRIPTION
  # This function lets you write to the console using 24-bit color depth.
  # You can specify colors using its RGB values.
  # .EXAMPLE
  # Write-RGB 'Hello World'
  # Will write the text using the default colors.
  # .EXAMPLE
  # Write-RGB 'Hello world' -f Pink
  # Will write the text in a pink foreground color.
  # .EXAMPLE
  # Write-RGB 'Hello world' -f violet -BackgroundColor Olive
  # Will write the text in a pink foreground color and an olive background color.
  # .EXAMPLE
  # Write-RGB $alainQtec_ascii -f SlateBlue -BackgroundColor black ; $Host.UI.WriteLine([Environment]::NewLine)
  [CmdletBinding(DefaultParameterSetName = 'Name')]
  param (
    # The text you want to write.
    [Parameter(Mandatory = $true, Position = 0, ParameterSetName = '__AllParameterSets')]
    [ValidateNotNullOrEmpty()]
    [string]$Text,

    [Parameter(Mandatory = $true, Position = 1, ParameterSetName = 'Name')]
    $ForegroundColor,

    # The foreground color of the text. Defaults to white.
    [Parameter(Mandatory = $false, Position = 1, ParameterSetName = 'Code')]
    [rgb]$Foreground = [rgb]::new(255, 255, 255),

    [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'Name')]
    $BackgroundColor,

    # The background color of the text. Defaults to PowerShell Blue.
    [Parameter(Mandatory = $false, Position = 2, ParameterSetName = 'Code')]
    [rgb]$Background = [rgb]::new(1, 36, 86),

    # No newline after the text.
    [switch]$NoNewLine
  )
  Begin {
    $escape = [char]27 + '['
    $resetAttributes = "$($escape)0m"
    $fxn = ('[' + $MyInvocation.MyCommand.Name + ']')
    $IAP = $InformationPreference; $InformationPreference = 'Continue'
  }
  Process {
    $psBuild = $PSVersionTable.PSVersion.Build
    [double]$VersionNum = $($PSVersionTable.PSVersion.ToString().split('.')[0..1] -join '.')
    if ([bool]$($VersionNum -le [double]5.1)) {
      if ($PsCmdlet.ParameterSetName -eq 'Name') {
        $f = "$($escape)38;2;$($colors.$ForegroundColor.Red);$($colors.$ForegroundColor.Green);$($colors.$ForegroundColor.Blue)m"
        $b = "$($escape)48;2;$($colors.$BackgroundColor.Red);$($colors.$BackgroundColor.Green);$($colors.$BackgroundColor.Blue)m"
      } elseif ($PsCmdlet.ParameterSetName -eq 'Code') {
        $f = "$($escape)38;2;$($Foreground.Red);$($Foreground.Green);$($Foreground.Blue)m"
        $b = "$($escape)48;2;$($Background.Red);$($Background.Green);$($Background.Blue)m"
      }
      if ([bool](Get-Command Write-Host -ErrorAction SilentlyContinue)) {
        Write-Host ($f + $b + $Text + $resetAttributes) -NoNewline:$NoNewLine
      } else {
        Write-Host ($f + $b + $Text + $resetAttributes) -NoNewline:$NoNewLine
      }
    } else {
      $Host.UI.WriteLine($Text)
      Write-Error "$fxn This function can only work with PowerShell versions lower than '5.1 build 14931' or above.`nBut yours is '$VersionNum' build '$psBuild'"
    }
  }
  End {
    $InformationPreference = $IAP
  }
}