Multiple foreground colors in PowerShell in one command
You could roll your own Write-Color command or something that looks for inline tokens that change the color. This is how ANSI escape sequences used to work back in the BBS days.
But you could achieve what you want by doing:
Write-Host "Red " -f red -nonewline; Write-Host "Blue " -f blue;
Here's a simple little function that does what you asked.
function Write-Color([String[]]$Text, [ConsoleColor[]]$Color) { for ($i = 0; $i -lt $Text.Length; $i++) { Write-Host $Text[$i] -Foreground $Color[$i] -NoNewLine } Write-Host}Write-Color -Text Red,White,Blue -Color Red,White,Blue
Edit (7th May 2018): I've updated Write-Color to 0.5 and published it as module. Also code is now published on github.
Changes in 0.5:
- added backgroundcolor
- added aliases T/B/C to shorter code
- added alias to function (can be used with “WC”)
- fixes to module publishing
Changes in 0.4
- fixed small issues
- published as module
Links to resources:
- GitHub Repository
- GitHub Reporting Issues
- PowerShellGallery Module
- Module description and a starting point.
Thanks to published module you can easily use the code as below:
Install-Module PSWriteColorWrite-Color -Text "Some","Text" -Color Yellow,Red
There is no more need to copy/paste code. Enjoy.
Old code is below. It's highly advised to use links above for newest code:
Edit (9th April 2018): I've updated Write-Color to v0.3. Feel free to get it at my site where I'm maintaining Write-Color. There are few small changes. Inluded -NoNewLine and -ShowTime option.
Edit (Jun 2017): updated with new version, added logging to file for logging purposes
Josh method was so great that I actually went and expanded it a bit for my needs. I've written blog post How to format PowerShell with Multiple Colors about it (with screenshots and all - for the whole story and usage).
function Write-Color([String[]]$Text, [ConsoleColor[]]$Color = "White", [int]$StartTab = 0, [int] $LinesBefore = 0,[int] $LinesAfter = 0, [string] $LogFile = "", $TimeFormat = "yyyy-MM-dd HH:mm:ss") { # version 0.2 # - added logging to file # version 0.1 # - first draft # # Notes: # - TimeFormat https://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx $DefaultColor = $Color[0] if ($LinesBefore -ne 0) { for ($i = 0; $i -lt $LinesBefore; $i++) { Write-Host "`n" -NoNewline } } # Add empty line before if ($StartTab -ne 0) { for ($i = 0; $i -lt $StartTab; $i++) { Write-Host "`t" -NoNewLine } } # Add TABS before text if ($Color.Count -ge $Text.Count) { for ($i = 0; $i -lt $Text.Length; $i++) { Write-Host $Text[$i] -ForegroundColor $Color[$i] -NoNewLine } } else { for ($i = 0; $i -lt $Color.Length ; $i++) { Write-Host $Text[$i] -ForegroundColor $Color[$i] -NoNewLine } for ($i = $Color.Length; $i -lt $Text.Length; $i++) { Write-Host $Text[$i] -ForegroundColor $DefaultColor -NoNewLine } } Write-Host if ($LinesAfter -ne 0) { for ($i = 0; $i -lt $LinesAfter; $i++) { Write-Host "`n" } } # Add empty line after if ($LogFile -ne "") { $TextToFile = "" for ($i = 0; $i -lt $Text.Length; $i++) { $TextToFile += $Text[$i] } Write-Output "[$([datetime]::Now.ToString($TimeFormat))]$TextToFile" | Out-File $LogFile -Encoding unicode -Append }}Write-Color -Text "Red ", "Green ", "Yellow " -Color Red,Green,YellowWrite-Color -Text "This is text in Green ", "followed by red ", "and then we have Magenta... ", "isn't it fun? ", "Here goes DarkCyan" -Color Green,Red,Magenta,White,DarkCyanWrite-Color -Text "This is text in Green ", "followed by red ", "and then we have Magenta... ", "isn't it fun? ", "Here goes DarkCyan" -Color Green,Red,Magenta,White,DarkCyan -StartTab 3 -LinesBefore 1 -LinesAfter 1Write-Color "1. ", "Option 1" -Color Yellow, GreenWrite-Color "2. ", "Option 2" -Color Yellow, GreenWrite-Color "3. ", "Option 3" -Color Yellow, GreenWrite-Color "4. ", "Option 4" -Color Yellow, GreenWrite-Color "9. ", "Press 9 to exit" -Color Yellow, Gray -LinesBefore 1Write-Color -LinesBefore 2 -Text "This little ","message is ", "written to log ", "file as well." -Color Yellow, White, Green, Red, Red -LogFile "C:\testing.txt" -TimeFormat "yyyy-MM-dd HH:mm:ss"Write-Color -Text "This can get ","handy if ", "want to display things, and log actions to file ", "at the same time." -Color Yellow, White, Green, Red, Red -LogFile "C:\testing.txt"
It actually brings additional checks and features over Josh script.
This function provides different syntactic sugar:
function color-Write{ # DO NOT SPECIFY param(...) # we parse colors ourselves. $allColors = ("-Black", "-DarkBlue","-DarkGreen","-DarkCyan","-DarkRed","-DarkMagenta","-DarkYellow","-Gray", "-Darkgray","-Blue", "-Green", "-Cyan", "-Red", "-Magenta", "-Yellow", "-White") $foreground = (Get-Host).UI.RawUI.ForegroundColor # current foreground $color = $foreground [bool]$nonewline = $false $sofar = "" $total = "" foreach($arg in $args) { if ($arg -eq "-nonewline") { $nonewline = $true } elseif ($arg -eq "-foreground") { if ($sofar) { Write-Host $sofar -foreground $color -nonewline } $color = $foregrnd $sofar = "" } elseif ($allColors -contains $arg) { if ($sofar) { Write-Host $sofar -foreground $color -nonewline } $color = $arg.substring(1) $sofar = "" } else { $sofar += "$arg " $total += "$arg " } } # last bit done special if (!$nonewline) { Write-Host $sofar -foreground $color } elseif($sofar) { Write-Host $sofar -foreground $color -nonewline }}
Examples:
color-Write This is normal textcolor-Write Normal -Red Red -White White -Blue Blue -ForeGround Normal