Anpassung und Konfiguration von Windows PowerShell
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.
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.
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.
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.
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 “> “ }
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.
MEHR BLOG-KATEGORIEN
- ASP.NET
- Active Directory
- Administration Tools
- Allgemein
- Backup
- ChatBots
- Configuration Manager
- DNS
- Data Protection Manager
- Deployment
- Endpoint Protection
- Exchange Server
- Gruppenrichtlinien
- Hyper-V
- Intune
- Konferenz
- Künstliche Intelligenz
- Linux
- Microsoft Office
- Microsoft Teams
- Office 365
- Office Web App Server
- Powershell
- Remote Desktop Server
- Remote Server
- SQL Server
- Sharepoint Server
- Sicherheit
- System Center
- Training
- Verschlüsselung
- Virtual Machine Manager
- Visual Studio
- WSUS
- Windows 10
- Windows 8
- Windows Azure
- Windows Client
- Windows Server
- Windows Server 2012
- Windows Server 2012R2
- Windows Server 2016
- Windows Server 2019
- Windows Server 2022
- Zertifikate