Einleitung

PowerShell lässt sich ähnlich der Linux Shell anpassen und modifizieren. Dabei sind nicht nur optische Veränderungen wie eine angepasste Prompt oder die Schrift- und Hintergrundfarbe realisierbar, sondern auch praktische Anpassungen wie beispielsweise vordefinierte Aliase und Funktionen oder das automatische Importieren von standardmäßig nicht geladenen PowerShell-Modulen. In diesem Blogpost erfahren Sie heute mehr darüber, wo sich die Konfigurationsdateien und Pfade befinden und wie man solche Anpassungen und Konfigurationen vornimmt.

Konfigurationsdateien und Pfade

PowerShell Profil

Wie die Bash unter Linux besitzt auch PowerShell eine Profil-Datei, die beim Start geladen und interpretiert werden kann. In dieser Datei können z. B. Befehle einmalig beim Start von PowerShell ausgeführt oder auch Funktionen und Aliase definiert werden, die anschließend in der PowerShell-Sitzung zur Verfügung stehen. Auf die verschiedenen Anpassungsmöglichkeiten, die sich hier bieten, werde ich später noch zurückkommen.

Insgesamt gibt es sechs verschiedene Profildateien bzw. Speicherorte für diese, die jeweils für verschiedene Szenarien greifen. Tabelle 1 zeigt eine kleine Übersicht darüber.

Tabelle 1: Übersicht über die verschiedenen PowerShell Profile. $Home zeigt auf den Benutzerprofilpfad, $PsHome auf das PowerShell Installationsverzeichnis (i.d.R. C:\Windows\System32\WindowsPowerShell\ v1.0)

Tabelle 1: Übersicht über die verschiedenen PowerShell Profile. $Home zeigt auf den Benutzerprofilpfad, $PsHome auf das PowerShell Installationsverzeichnis (i.d.R. C:\Windows\System32\WindowsPowerShell\
v1.0)

Module

Installierte Module können in PowerShell-Sitzungen über das Import-Module Cmdlet importiert und anschließend benutzt werden. Damit dieses das Modul ohne vollständige Pfadangabe findet, muss es sich innerhalb eines Pfades befinden, welcher in der Umgebungsvariable PSModulePath gelistet ist. Eine Übersicht über die standardmäßig darin enthaltenen Pfade zeigt Tabelle 2, eigene Pfade können jederzeit nach Belieben der Umgebungsvariable hinzugefügt werden.

Tabelle 2: Übersicht über die verschiedenen Modulpfade. $Home zeigt auf den Benutzerprofilpfad, $PsHome auf das PowerShell Installationsverzeichnis (i.d.R. C:\Windows\System32\WindowsPowerShell\ v1.0) und $Env:ProgramFiles auf das Programminstallationsverzeichnis (i.d.R. C:\Programme)

Tabelle 2: Übersicht über die verschiedenen Modulpfade. $Home zeigt auf den Benutzerprofilpfad, $PsHome auf das PowerShell Installationsverzeichnis (i.d.R. C:\Windows\System32\WindowsPowerShell\
v1.0) und $Env:ProgramFiles auf das Programminstallationsverzeichnis (i.d.R. C:\Programme)

Anpassungsmöglichkeiten

Wie bereits erwähnt, lässt sich PowerShell über eine entsprechende Profildatei anpassen. Im Nachfolgenden werde ich nun ein paar Möglichkeiten aufzeigen, was man hierüber beispielsweise umsetzen kann. Codebeispiele können zum Übernehmen einfach in die Profile.ps1-Datei eingefügt werden.

Farben

Schrift-und Hintergrundfarbe der PowerShell kann über die Eigenschaften

$Host.UI.RawUI.ForegroundColor
$Host.UI.RawUI.BackgroundColor

festgelegt werden. Hierzu diesen einfach den entsprechenden Wert zuweisen, zB ändert

$Host.UI.RawUI.ForegroundColor = ‘Black’
$Host.UI.RawUI.BackgroundColor = ‘White’
Clear-Host

die Hintergrundfarbe auf Weiß und die Schriftfarbe auf Schwarz. Der Clear-Host Befehl am Ende ist nötig, um das Konsolenfenster nach den Änderungen zu aktualisieren und diese somit auch darzustellen.

Hat man obige Farbeinstellungen übernommen wird man schnell bemerken, dass z. B. der gelb dargestellte Text von Cmdlets oder Warnungen kaum noch lesbar erscheint. Aber auch dies lässt sich anpassen – im Falle der Warning/Error/Verbose/Debug Ausgaben handelt es sich wieder um Eigenschaften (s. Tabelle 3), denen ein neuer Farbwert zugewiesen werden kann.

Tabelle 3: Farbeigenschaften der Warning/Error/Verbose/Debug Ausgaben

Tabelle 3: Farbeigenschaften der Warning/Error/Verbose/Debug Ausgaben

Die Farbdarstellung der einzelnen Elemente der PowerShell-Konsole kann über das Set-PSReadlineOption Cmdlet modifiziert werden. Alle anpassbaren Elemente sind in Tabelle 4 aufgelistet. Möchte man beispielsweise nun den gelben Text der Befehle/Cmdlets auf dunkelrot ändern, so fügt man der Profildatei einfach folgenden Befehl hinzu

Set-PSReadlineOption -TokenKind Command -ForegroundColor DarkRed

Über den Parameter -BackgroundColor kann zusätzlich noch eine spezielle Hintergrundfarbe für den ausgegebenen Text festgelegt werden.

Tabelle 4: Auflistung der einzelnen PowerShell Textelemente, welche farblich angepasst werden können.

Tabelle 4: Auflistung der einzelnen PowerShell Textelemente, welche farblich angepasst werden können.

Zusammengefasst könnte folgender Code in der Profildatei z. B. ein „light theme“ festlegen:

$Host.UI.RawUI.ForegroundColor = ‘Black’
$Host.UI.RawUI.BackgroundColor = ‘White’
$Host.PrivateData.WarningForegroundColor = ‘Magenta’
$Host.PrivateData.WarningBackgroundColor = ‘White’
$Host.PrivateData.ErrorForegroundColor = ‘Red’
$Host.PrivateData.ErrorBackgroundColor = ‘White’
$Host.PrivateData.VerboseForegroundColor = ‘Magenta’
$Host.PrivateData.VerboseBackgroundColor = ‘White’
$Host.PrivateData.DebugForegroundColor = ‘Blue’
$Host.PrivateData.DebugBackgroundColor = ‘White’
Set-PSReadlineOption -TokenKind Command -ForegreoundColor DarkRed
Set-PSReadlineOption -Variable Command -ForegreoundColor DarkGreen
Set-PSReadlineOption -TokenKind Number -ForegreoundColor Black
Clear-Host

Als kleines Anwendungsbeispiel könnte man hier z. B. ein “dark theme” und ein “light theme” erstellen und entsprechend der aktuellen Tageszeit anwenden, um die Augen zu schonen.

Prompt

Auch die PowerShell Prompt

PS C:\User\heilig>

kann angepasst werden, um z. B. mehr Informationen als nur das aktuelle Verzeichnis anzuzeigen. Hierzu überschreiben wir die folgende Funktion im PowerShell-Profil

function prompt
{
}

Bevor am Ende der Funktion eine beliebige Zeichenkette zurückgegeben wird, die als Trennzeichen zwischen Prompt und Eingabebereich fungiert, kann erstere vorher nach Belieben durch entsprechende Befehle angepasst werden. In der Regel werden hilfreiche Informationen ausgegeben; nachfolgend habe ich ein paar davon als Anregung aufgeführt.

Beispiel 1:            Anzahl der Dateien und Ordner im aktuellen Verzeichnis

„[{0}]“ -f  (Get-ChildItem).Count | Write-Host -ForegroundColor Gray -NoNewline

Beispiel 2:            Nur der hintere Teil des aktuellen Verzeichnisses (mehr Platz im Eingabebereich für Befehle bei längeren Verzeichnisnamen)

Get-Location | Split-Path -Leaf | Write-Host -NoNewline

Beispiel 3:            Kennzeichnung, ob aktuelle Sitzung mit erhöhten Rechten ausgeführt wird

$isElevated = [System.Security.Principal.WindowsPrincipal]::New(
[System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole(
[System.Security.Principal.WindowsBuiltInRole]::Administrator
)
“{0}” -f @(‘$’,’#’)[$isElevated] | Write-Host -ForegroundColor @(‘Cyan’,’Red’)[$isElevated] -NoNewline

Wie zu sehen ist, sind der Fantasie hier keine Grenzen gesetzt nach eigenen Prioritäten zu gestalten. Zum Abschluss hier nochmal die komplette Funktion mit den genannten Beispielen als kleine Vorlage zusammengesetzt. Bild 1 und 2 zeigen das Ergebnis.

$isElevated = [System.Security.Principal.WindowsPrincipal]::New(
[System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole(
[System.Security.Principal.WindowsBuiltInRole]::Administrator
)

function prompt
{
    Get-Location | Split-Path -Leaf | Write-Host -NoNewline
    „ [{0}] “ -f  (Get-ChildItem).Count | Write-Host -ForegroundColor Gray -NoNewline
    “{0}” -f @(‘$’,’#’)[$isElevated] | Write-Host -ForegroundColor @(‘Cyan’,’Red’)[$isElevated] -NoNewline
    return “> “
}
Bild 1: Modifizierte Prompt der PowerShell Sitzung „als Administrator ausführen“

Bild 1: Modifizierte Prompt der PowerShell Sitzung „als Administrator ausführen“

Bild 2: Modifizierte Prompt der PowerShell Sitzung als normaler Benutzer

Bild 2: Modifizierte Prompt der PowerShell Sitzung als normaler Benutzer

Module, Funktionen & Aliase

Eher praktischer Natur ist das automatische Laden von Modulen und das Anlegen von Aliasen und Funktionen.

Hat man z. B. selbst angefertigte Module, die nach jedem Start der PowerShell standardmäßig vorhanden bzw. importiert sein sollen, dann gehört der dazu benötigte Import-Module Befehl in das PowerShell Profil. Anschließend stehen die aus dem Modul exportierten Cmdlets in der aktuellen Sitzung zur Verfügung – und das automatisch, jedes mal wenn PowerShell mit dem entsprechenden Profil gestartet wird.

Ebenfalls hat man die Möglichkeit dazu, hilfreiche Funktionen und Aliase zu definieren, die während der alltäglichen Arbeit auf der Kommandozeile oft benötigt werden.

Abschließend lässt sich also sagen, dass sich PowerShell was die Anpassung des Profils betrifft nicht hinter der Linux Bash verstecken muss – vieles ist auch hier mit ein paar Handgriffen realisierbar.