Wie man langsame Startzeiten für die PowerShell-Konsole und Skripte behebt

Langsame PowerShell-Starts sind ein häufiges Ärgernis, insbesondere auf Systemen, auf denen das Öffnen eines Terminalfensters gefühlt ewig dauert. Manchmal liegt es an Profildateien, die versuchen, unzählige benutzerdefinierte Funktionen oder Module zu laden, oder daran, dass bestimmte Module einfach nur langsam initialisiert werden – was die Ausführung von Skripten und Anmeldeskripten extrem verlangsamen kann. Und da Windows die Dinge oft unnötig verkompliziert, treten diese Verzögerungen auf verschiedenen Rechnern ohne erkennbare Ursache auf und lassen die Benutzer ratlos zurück. Die gute Nachricht? Es gibt zahlreiche Optimierungen und Überprüfungen, die den Start beschleunigen und PowerShell schneller und reibungsloser machen – egal, ob Sie nur kurz nachsehen oder ein Skript in einer geplanten Aufgabe ausführen.

Wie man das Problem eines langsamen PowerShell-Starts behebt

Methode 1: Messen Sie die Startzeit, um festzustellen, was zu langsam lädt

Das ist hilfreich, da es Aufschluss darüber gibt, was die Verzögerung verursachen könnte – Profile, Module oder etwas anderes. Ohne einen Vergleichswert wissen Sie nicht, welche Einstellungen Sie optimieren sollten. Mit Measure-Command können Sie die Startzeit von PowerShell und die Ausführungszeit eines einfachen Befehls überprüfen und so die Startgeschwindigkeiten in verschiedenen Konfigurationen vergleichen.

Führen Sie dies in einem PowerShell-Fenster aus:

powershell -noprofile -ExecutionPolicy Bypass ( Measure-Command { powershell "Write-Host 1" } ).TotalSeconds

Diese Funktion misst die Zeit, die zum Starten von PowerShell und zur Ausführung eines kurzen Befehls benötigt wird, ohne dass Profile geladen werden. Bei manchen Systemen können Ladezeiten von über 10 Sekunden auftreten – was viel zu lang ist. In diesem Fall kann die Analyse der Startprofile langsame Befehle oder ressourcenintensive Module aufdecken, die die Leistung beeinträchtigen.

Methode 2: Profile überspringen, um die Basislinie zu überprüfen

Profile können tückisch sein – manchmal enthalten sie langsame Befehle oder laden große Module. Der Start von PowerShell mit der Option `-noprofile` überspringt diese vollständig, was die Ausführung in der Regel deutlich beschleunigt. Dies ist nützlich, um zu bestätigen, dass Profile die Verlangsamung verursachen, oder um einfach einen schnelleren Startpunkt zu erreichen.

Laufen:

powershell.exe -noprofile

oder für PowerShell Core:

pwsh.exe -noProfile

Wenn dies den Vorgang deutlich beschleunigt, ist die Profilerstellung der nächste Schritt. Prüfen Sie, welche Profildateien zum Laden mit Folgendem konfiguriert sind:

$profile | select *

Überprüfen Sie diese Dateien anschließend manuell auf ressourcenintensive Befehle oder unnötige Modulladungen. Manchmal versucht das Benutzerprofilskript, Dutzende von Modulen zu laden oder langsame Befehle auszuführen, was die Leistung erheblich beeinträchtigt. Durch das Entfernen oder Optimieren dieser Skripte lassen sich die Startzeiten deutlich verkürzen.

Methode 3: Module einschränken und Ihre PowerShell-Umgebung optimieren

Die automatische Modulladung von PowerShell kann die Ausführung verlangsamen, wenn viele Module installiert sind. Um zu überprüfen, welche Module installiert und geladen sind, führen Sie folgenden Befehl aus:

$Env:PSModulePath -split ';'

Hier werden die Pfade angezeigt, in denen die Module gespeichert sind. Um die verfügbaren Module anzuzeigen und zu prüfen, welche tatsächlich geladen sind, versuchen Sie Folgendes:

Get-Module -ListAvailable

Anschließend können Sie alle installierten Module, einschließlich der Drittanbietermodule, anzeigen lassen:

Get-InstalledModule

Deinstallieren Sie Module, die Sie nie verwenden:

Remove-Module -Name ModuleName; Uninstall-Module -Name ModuleName -AllVersions -Force

Profi-Tipp: Sie können auch überprüfen, wie lange das Laden jedes Moduls dauert, indem Sie es explizit importieren und die Ladezeit messen:

Measure-Command { Import-Module ModuleName -Force }

Und noch besser: Alle installierten Module können schnell analysiert werden:

 $modules = Get-InstalledModule | Select-Object -ExpandProperty Name -Unique foreach ($mod in $modules) { $time = Measure-Command { Import-Module $mod -Force } [PSCustomObject]@{ Module = $mod LoadTimeSec = $time. TotalSeconds } } 

Module, die länger als ein oder zwei Sekunden benötigen, sollten beim Start deaktiviert werden. Um das automatische Laden von Modulen zu verhindern, fügen Sie diese Zeile zu Ihrem Profil hinzu:

$PSModuleAutoLoadingPreference = 'None'

Sie können Module dann bei Bedarf manuell laden mit:

Import-Module ModuleName

Dadurch bleibt das Startup schlanker, insbesondere wenn man mit einer Unmenge an Modulen jongliert, die nicht in jeder Sitzung benötigt werden.

Methode 4: Umgang mit bekannten langsamen Modulen (wie VMware PowerCLI)

Manche Module, insbesondere VMware PowerCLI, können minutenlang hängen bleiben, wenn Ihr System externe Zertifikate nicht verifizieren kann – beispielsweise im Offline-Modus oder wenn die Firewall die CRL-Prüfungen blockiert. Das Deaktivieren der CRL-Prüfungen in Windows kann Abhilfe schaffen.

reg add HKLM\SYSTEM\CurrentControlSet\Services\SstpSvc\Parameters /v NoCertRevocationCheck /t REG_DWORD /d 0x00000001 /f

Oder deaktivieren Sie die Zertifikatssperrprüfung in Internet Explorer unter Optionen > Erweitert. Denn natürlich muss Windows die Dinge unnötig verkomplizieren.

Methode 5: Überprüfung der Antivireninterferenzen

Das ist ein tückischer Fehler. Antivirenprogramme, insbesondere solche für Unternehmen oder einige Sicherheitssuiten, scannen beim Start häufig DLLs oder überwachen Prozesse intensiv – was den Start von PowerShell verlangsamt. Um dies zu testen, können Sie die geladenen Module beim Start von PowerShell erfassen:

  1. Öffnen Sie cmd.exe und führen Sie Folgendes aus:
    powershell.exe -c "Write-Host $PID;Start-Sleep -s 60"
  2. Kopieren Sie die angezeigte ^PID^ und führen Sie den Befehl anschließend in einem neuen PowerShell-Fenster aus:
    Get-Process | where {$_. Id -eq <YOUR_PID>} | select -ExpandProperty modules
  3. Suchen Sie nach Antivirus- oder Sicherheits-DLLs – falls vorhanden, versuchen Sie, PowerShell-Executables in Ihren Antivirus-Einstellungen auf die Whitelist zu setzen.

Für Windows Defender können Sie Ausnahmen wie folgt hinzufügen:

Add-MpPreference -ExclusionProcess "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe", "C:\Program Files\PowerShell\7\pwsh.exe"

Das wird hoffentlich verhindern, dass das Antivirenprogramm die Startzeiten beeinträchtigt.

Methode 6: Umgang mit. NET Framework und PowerShell Native Image Generation (NGen)

Falls langsame. NET-Bibliotheksaufrufe die Ursache sind, können Sie ngen.exe (Native Image Generator) auf Ihre Assemblies anwenden. Dadurch werden die Assemblies in nativen Code vorkompiliert, was die Ladezeit verkürzt. Das ist etwas aufwendiger, aber im Notfall durchaus lohnenswert.

$env:PATH = [Runtime. InteropServices. RuntimeEnvironment]::GetRuntimeDirectory() [AppDomain]::CurrentDomain. GetAssemblies() | ForEach-Object { $path = $_. Location if ($path) { $name = Split-Path $path -Leaf Write-Host "Running ngen on '$name'" -ForegroundColor Yellow & ngen install $path /nologo } }

Hinweis: Führen Sie dieses Skript mit Administratorrechten aus und erstellen Sie vorher einige Backups. Es ist zwar nicht narrensicher, verkürzt aber auf manchen Systemen die Startzeiten deutlich.

Und wenn nichts anderes funktioniert…

Hier kommt der Prozessmonitor von Sysinternals ins Spiel. Sie können Filter für powershell.exe festlegen und sehen, was den Startvorgang verlangsamt. Möglicherweise hängt eine DLL- oder Registry-Aufruf, oder Sie bemerken langsame Netzwerkprüfungen. Manchmal hilft es auch, die PowerShell-Verlaufsdatei zu bereinigen (die bei manchen Systemen sehr groß werden kann) – löschen Sie dazu die ConsoleHost_history.txtDatei im AppData-Ordner.

Im Allgemeinen liegt es nicht immer an einer einzigen Ursache. Manchmal sind es Profile, Module oder sogar der Virenscanner. Aber diese Überprüfungen und Optimierungen bringen in der Regel schon eine deutliche Verbesserung. Denn natürlich muss Windows es unnötig kompliziert machen – typisch.

Zusammenfassung

  • Messen Sie die Startzeit, um Measure-CommandEngpässe zu identifizieren.
  • Überspringen Sie die Profile, um die Basisleistung zu überprüfen.
  • Überprüfen und reduzieren Sie die Anzahl der geladenen Module.
  • Deaktivieren Sie die CRL-Prüfungen, wenn Module wie PowerCLI langsam geladen werden.
  • Das Whitelisting von PowerShell in Antivirensoftware hilft, Verzögerungen zu vermeiden.
  • Erwägen Sie gegebenenfalls die Verwendung von ngen.exe zum Vorkompilieren von. NET-Assemblies.
  • Verwenden Sie Process Monitor für eine detaillierte Startanalyse.

Zusammenfassung

Hoffentlich helfen diese Tipps, die Sache etwas zu beschleunigen. Es ist zwar etwas mühsam, die Ursache für die langsame PowerShell-Performance zu finden, aber sobald man den Dreh raus hat, lässt sich das Problem meist beheben. In der Regel sind Profile oder Module die Übeltäter. Beachten Sie jedoch, dass es sich bei manchen Konfigurationen um eine Kombination aus all dem handelt. Viel Erfolg und ich drücke die Daumen, dass dies jemandem hilft, die Startzeit zu verkürzen!