Farben der Powershell im Griff behalten

16. April 2010

Wer die Powershell bereits im Einsatz hat, der ist vielleicht in der Lage, mit Hilfe des passenden Shortcuts die Bildschimfarben der Powershell-Konsole zu modifizieren. Doch eigene Cmdlets für die Farbumstellung gibt es nicht.

Beim Kommandozeilen-Fenster CMD.EXE gibt es dazu das einfache Kommando Color – doch bei der Powershell sieht das anders aus: Es ist zwar auch kein schwierige Aufgabe, doch etwas mehr Tipp-Arbeit als bei CMD.EXE fällt schon an.

Doch mit einem Paar von Powershell-Skripts für das Ändern der Farbeinstellungen der Powershell-Konsole lässt sich der Aufwand reduzieren. Dazu hat der Autor die Skripts Get-Color.ps1 und Set-Color.ps1 geschrieben. Mit ihnen wird der Farbwechsel in der Powershell-Konsole zum Kinderspiel.

Die möglichen 16 Bezeichnungen für die Farben und ihre zugehörigen Hex-Werte für die Vorder- und Hintergrundfarben in der Konsole.

Im Kommandozeilen-Fenster CMD.EXE werden die Farben als ein Paar von hexadezimalen Zeichen repräsentiert. Dabei kennzeichnet die erste Hex-Stelle die Hintergrundfarbe und die zweite kümmert sich um die Vordergrundfarbe (also üblicherweise die Farbe des Textes).

Dazu ein Beispiel: 1F gibt an, dass weißer Text vor einem dunkelblauen Hintergrund steht. Um nun diese Farbzusammenstellung bei CMD.EXE zu erreichen, ist folgender Befehl nötig (auf der Kommandozeile einzugeben):

Color 1F

Die Powershell arbeitet dagegen mehr nach dem objektorientiertem Ansatz. Daher kommen bei ihr die entsprechenden Properties zum Einsatz. Es gibt eine Property namens BackgroundColor und eine mit der Bezeichnung ForegroundColor. Diese beiden Properties gehören zum Powershell-Objekt $HOST.UI.RawUI.

Um zum Beispiel dieselbe Wirkung zu entfalten, wie das bei der Kommandozeile mit dem zuvor beschriebenen Befehl der Fall war (Color 1F), ist bei der Powershell diese Befehlsfolge nötig:

$HOST.UI.RawUI.BackgroundColor   = "DarkBlue"
$HOST.UI.RawUI.ForegroundColor   = "White"

Dabei ist zu beachten, dass die einzelnen Befehlszeilen immer auf einer Zeile eingegeben werden müssen. Ein Zeilenumbruch innerhalb einer Befehlszeile darf nicht erfolgen. Bei der Powershell darf der Administrator aber auch die Zeichenketten mit den Farbbezeichnungen für die Properties BackgroundColor und ForegroundColor angeben, denn die Powershell übersetzt jede Zeichenkette automatsich in den richtigen Datentyp (hier der Dotnet-Typ System.ConsoleColor)

Die Abbildung mit der tabellarischen Darstellung im Powershell-Fenster verdeutlicht die möglichen 16 Bezeichnungen für die Farben und ihre zugehörigen Hex-Werte.

Eine andere Option, wie sich bei der Powershell die Farben angeben lassen, ist die Angabe des numerischen Farbwerts für die beiden Farb-Properties des $HOST.UI.RawUI-Objekts, wie das die folgenden zwei Powershell-Befehlszeile zeigen

$HOST.UI.RawUI.BackgroundColor = 1
$HOST.UI.RawUI.ForegroundColor = 15

Das ist zwar weniger Tipp-Arbeit als der Einsatz der Farbnamen aber immer noch mehr Aufwand als beim Color-Befehl von CMD.EXE. Doch mit einem Skript-Paar für das Ändern der Farbeinstellungen der Powershell kann man den Aufwand weiter reduzieren.

Dazu hat der Autor die Skripts Get-Color.ps1 und Set-Color.ps1 geschrieben. Mit ihnen wird der Farbwechsel in der Powershell-Konsole zum Kinderspiel.Das folgende Listing zeigt das Skript Get-Color.ps1.

param([Switch] $Table)
 
# If -table exists, output a color list.
if ($Table) {
  for ($bg = 0; $bg -lt 0x10; $bg++) {
    for ($fg = 0; $fg -lt 0x10; $fg++) {
      Write-Host -nonewline -background $bg -foreground $fg `
        (" {0:X}{1:X} " -f $bg,$fg)
    }
    Write-Host
  }
  Exit
}
 
# Output the current colors as a string.
" {0:X}{1:X} " -f [Int] $HOST.UI.RawUI.BackgroundColor,
  [Int] $HOST.UI.RawUI.ForegroundColor

Ruft der Administrator dieses Skript ohne einen Parameter auf, gibt es eine hexadezimale Zeichenkette mit zwei Zeichen aus. Das erste Hex-Zeichen davon steht für die Hintergrund-Farbe und das zweite für die Farbe des Textes (also die Vordergrund-Farbe). Wer die Ausgabe des Skripts in einer Variablen speichert, der macht sich das Wiederherstellen der Farbkombination zu einem späteren Zeitpunkt recht einfach.

Ruft der Administrator das Skript Get-Color.ps1 mit dem Parameter -table auf, bekommt er eine Tabelle mit allen machbaren Farbkombinationen dargestellt. das zeigt die Abbildung am Anfang des Beitrags.

Die möglichen 16 Bezeichnungen für die Farben und ihre zugehörigen Hex-Werte für die Vorder- und Hintergrundfarben in der Konsole.

Mit Hilfe dieser Tabelle kann man sich die Auswahl der Farbkombination für die Powershell-Konsole visuell vereinfachen. Das folgende Listing zeigt, wie das Skript Set-Color.ps1 aussieht. Es eignet sich zum Umstellen der Farbkombination in der Powershell-Konsole:

param([String] $Color = $(throw "Please specify a color."))

# Trap the error and exit the script if the user
# specified an invalid parameter.
trap [System.Management.Automation.RuntimeException] {
  Write-Error -errorrecord $ERROR\[0]
  Exit
}
 
# Assume -color specifies a hex value and cast it to a [Byte].
$newcolor = [Byte] ("0x{0}" -f $Color)
# Split the color into background and foreground colors. The
# [Math]::Truncate method returns a [Double], so cast it to an [Int].
$bg = [Int] [Math]::Truncate($newcolor / 0x10)
$fg = $newcolor -band 0xF

# If the background and foreground colors match, throw an error;
# otherwise, set the colors.
if ($bg -eq $fg) {
  Write-Error "The background and foreground colors must not match."
} else {
  $HOST.UI.RawUI.BackgroundColor = $bg
  $HOST.UI.RawUI.ForegroundColor = $fg
}

Dieses Skript benötigt nur einen Parameter: einen zweistelligen Hex-Wert, der die gewünschten Farben für den neuen Vorder- und Hintergrund angibt. Dabei ist der Parameter für das Skript Set-Color.ps1 identisch mit dem Parameter, den man beim Color-Kommando von CMD.EXE einsetzen würde. Sprich das erste hex-Zeichen steht für die Hintergrundfarbe und das zweite für die Farbe des Textes. Zum Beispiel würde der Befehl

Set-Color 9F

Die Farben in der Powershell-Konsole so setzen, dass eine weiße Schrift auf dunkelblauen Hintergrund angezeigt wird.

Sollte der Wert für einen Parameter nicht gültig sein oder aber wenn man Hinter- und Vordergrundfarbe identisch wählt (dann kann man die Informationen in der Anzeige nicht erkennen) reagiert das Skript mit einer Fehlermeldung.

Das Kombinieren der beiden Skripts bringt weitere Vorteile: Die aktuellen Farbzusammenstellungen lassen sich speichern, dann wird eine neue Farbkomposition gewählt und zu einem späteren Zeitpunkt kann man wieder auf die ursprüngliche Kombination zurückspringen. Dazu ist folgender Code nötig:

$colors = Get-Color
Set-Color 4F
Remove-Item $ENV:Temp\* -confirm
Set-Color $colors

In der ersten Zeile werden die aktuellen Farbeinstellungen ermittelt (mit dem Skript Get-Color.ps1). Die zweite Zeile ändert die aktuelle Farbzusammenstellung auf weißen Text vor rotem Hintergrund. In der dritten Zeile wird dann das Cmdlet Remove-Item ausgeführt, das alle Dateien im Verzeichnis Temp löscht, um freien Platz auf der Festplatte zurück zu bekommen.

Dabei werden die angezeigten Informationen dann bereits in den neu eingestellten Farben erscheinen. Und die letzte Zeile kümmert sich danach um das Wiederherstelle der ursprünglichen Farbeinstellung.

Wer nicht genau weiß, wie er die beiden Powershell-Skripts zum Laufen bringt, der kann sich im ersten Beitrag unserer Powershell-Reihe die nötigen Kenntnisse aneignen.

Bill Stewart/rhh

Lesen Sie auch