Fix: Langsames Start der PowerShell -Konsole und Skripte

/de/images/powershell-console-takes-30-second-to-open.png

Ich habe festgestellt, dass die PowerShell -Konsole manchmal lange dauert, bis es sich öffnet. Dieses Problem tritt auf verschiedenen Computern auf. In einigen Fällen kann es einige Minuten dauern, bis PowerShell geladen wird. Dies wirkt sich auf die Öffnung der Befehlshellschale (Powershell.exe oder pwsh.exe) und die Ausführungszeit der Anmeldung von PowerShell -Skripten aus, die über GPO oder Skripte in den geplanten Aufgaben gestartet wurden. In diesem Beitrag wird erläutert, wie potenzielle Gründe für das Start von langsamem PowerShell identifiziert werden und die Ladezeit verkürzt werden können.

Hier sind einige häufige Gründe, warum das Laden von PowerShell möglicherweise lange dauern kann:

  • Benutzerdefinierte Funktionen in PowerShell-Profildateien werden jedes Mal geladen, wenn der Prozess von PowerShell.exe startet

  • Eine erhebliche Anzahl von PS -Modulen wird installiert und automatisch geladen

  • Das PSReadline -Modul lädt eine riesige Datei mit den Befehlen von PowerShell -Befehlen

  • Signifikante Verlangsamungen bei PowerShell- und Modulbeladungen werden durch Konflikte oder Verfälle in den Komponenten von Framework verursacht.

Das Mess-Command-CMDLet kann verwendet werden, um die Ladezeit eines PowerShell-Prozesses zu messen. Verwenden Sie diesen Befehl, um die Ladezeit von PowerShell im normalen Modus zu überprüfen .::

PowerShell-Noprofile-executionPolicy Bypass (Mess-Command {PowerShell" Write-Host 1 "}) .Totalseconds

/de/images/powershell-console-takes-30-second-to-open.png

In dem Befehl wird angezeigt, wie lange es gedauert hat, bis der PowerShell -Prozess einen einfachen Befehl geladen und ausgeführt hat.

Wenn PowerShell beginnt, kann es die Zeit melden, die für die Last benötigt wird.


Loading personal and system profiles took XXX ms

/de/images/message-in-powershell-loading-personal-and-system.png

Wie Sie in diesem Beispiel sehen können, dauerte der Laden des PowerShell -Prozesses 12 Sekunden. Das ist ziemlich viel. Diese Nachricht wird automatisch angezeigt, wenn die Ladezeit der PowerShell -Profile 500 ms überschreitet.

Dies deutet darauf hin, dass PowerShell -Profildateien bei jedem Start des Vorgangs langsamer Code ausführen.

Vergleichen Sie die Startgeschwindigkeit des PowerShell -Prozesses, wenn Profile nicht geladen werden. Führen Sie dazu den Shell-Prozess mit der Noprofile-Option aus:

Powershell.exe-noprofile

oder um den PowerShell -Kern zu führen:

pwsh.exe-noprofile

/de/images/run-powershell-without-loading-profiles.png

Wie Sie sehen können, begann PowerShell viel schneller, wenn Profile nicht geladen wurden. PowerShell -Profile sind PS1 -Dateien, mit denen die Benutzerumgebung konfiguriert wird. Sie ermöglichen dem Benutzer auch, bestimmte Befehle auszuführen und benutzerdefinierte Funktionen oder Module zu laden.

Standardmäßig werden PowerShell -Profildateien nicht verwendet (es werden keine Profildateien erstellt). Der folgende Befehl zeigt eine Liste aller Profildateien an, die beim Starten des PowerShell -Vorgangs geladen werden.

$ Profil | Wählen Sie *

/de/images/list-powershell-profiles.png

Überprüfen Sie den Inhalt aller Profildateien für den Benutzer manuell oder verwenden Sie die folgenden Befehle, um sie anzuzeigen:

`Get-Content $ Profil.Allusersallhosts

Get-Content $ Profil.Alluserscurrenthost

Get-Content $ Profil.CurrentuserAllhosts

Get-Content $ Profil.CurrentuSerrenthost `

In meinem Fall werden einige Befehle zur Datei microsoft.powerShell_profile.ps1 hinzugefügt. Überprüfen Sie die Profildatei, um sicherzustellen, dass alle Befehle und Funktionen erforderlich sind. Entfernen Sie nach Möglichkeit unnötige Befehle und optimieren Sie den Code. /de/images/list-used-powershell-profile-files.png

Eine große Anzahl von installierten Modulen könnte ein weiterer möglicher Grund für das langsame Start von PowerShell sein. PowerShell lädt Module automatisch aus den folgenden Ordnern:


C:\Users\%username%\Documents\WindowsPowerShell\ModulesC:\Program Files\WindowsPowerShell\ModulesC:\Windows\system32\WindowsPowerShell\v1.0\Modules

Ihre Liste kann wie folgt angezeigt werden:

`$ Env: psmodulepath-split ‘;’ '

/de/images/list-used-ps-module-paths.png

Listen Sie die PS -Module auf, die in die Sitzung geladen wurden.

Get-Modul-listaVerable

Listen Sie die installierten Module von Drittanbietern auf.

Get-installedModule

/de/images/get-installedmodule.png

Überprüfen Sie die Liste, um festzustellen, ob Sie alle Module benötigen. Unbenutzte PowerShell -Module deinstallieren :::::

`REMED-MODULE-NAME BURNTTOAST REMENDEN

Deinstallieren Sie den Modulnamen BurntToast-Allversions-Force `

Verwenden Sie den folgenden Befehl, um die Ladezeit jedes Moduls zu analysieren:

Mess-command {import-Module Modulenname-Force}

Oder überprüfen Sie die Ladezeit aller PS -Module in großen Mengen:

`$ modules = get-installedModule | Select-object-expandProperty Name-Einheit

foreach ($ mod in $ modules) {

$ time = mess-command {import-Module $ mod-force}

PScustomObject@{{

Module = $ mod

LoadTimeSec = $ time.totalseconds

}

} `

/de/images/measure-powershell-module-load-time.png

Sehen Sie, welche Module am längsten geladen werden.

Um zu verhindern, dass alle PS -Module automatisch geladen werden, fügen Sie der Profildatei die folgende Zeile hinzu:

$ PsmoduleAutoloadingPreference = 'none'

In diesem Fall können Sie das erforderliche Modul mit dem folgenden Befehl manuell laden:

Import-Module ModulenName

Stellen Sie sicher, dass Sie Ihrer Profildatei die folgenden allgemeinen Module hinzufügen:

`Import-Module Microsoft.PowerShell.utility

Import-Module Microsoft.PowerShell.Management `

Es gibt auch ein bekanntes Problem beim Laden des PowerShell -Moduls von VMware Infrastructure Management, auch als VMware PowerCli bezeichnet. Das Laden des Moduls kann einige Minuten dauern, bis ein Computer geladen wird, der nicht mit dem Internet verbunden ist. Das Problem ist, dass das Modul beim Laden versucht, eine externe Liste von widerruflichen Zertifikaten (CRL, Zertifikat-Widerrufsliste) zu überprüfen. Aufgrund mangelnder Internetkonnektivität wurde dieser Prozess zeitlich festgelegt. Die Lösung besteht darin, die CRL -Überprüfung in Windows zu deaktivieren. Sie können die CRL -Überprüfung über die Registrierung deaktivieren:

reg add HKLM \ System \ currentControlSet \ Services \ sstpsvc \ parameters/v nocerTrevocationCheck/t reg\_dword/d 0x00000001/f

Oder im Internet-Eigenschaften Applet: inetcpl.cpl-> Erweitert-> Unkontrolliert die Optionsprüfung für Publisher (Server) Zertifikat.

/de/images/disable-checking-for-publisher-server-certificat.png

Der Grund, warum PowerShell lange dauern kann, ist häufig die Antiviren -Software, die auf dem Computer installiert ist. Sie können überprüfen, welche externen DLLs und Module zu Beginn des PowerShell -Vorgangs geladen werden.

  1. Öffnen Sie cmd.exe und führen Sie den Befehl aus: PowerShell.exe-c" Schreibweih $ pid; Start-Sleep-S 60 "

  2. Dieser Befehl gibt die Prozess -ID (PID) des laufenden PowerShell.exe -Prozesses zurück. Kopieren Sie die

PID

und fügen Sie es in eine neue PowerShell -Sitzung in den folgenden Befehl ein:

Get-Process | wobei {$ \_. id-eq } | select-expandProperty-Module

3.. Sie erhalten eine Liste der DLLs, die zu Beginn des PowerShell -Vorgangs geladen werden. Überprüfen Sie, ob Ihre Antivirenbibliothek aufgeführt ist. In diesem Fall fügen Sie Ihren Antivirenausnahmen die PWSH.EXE- und PowerShell.exe -Prozesse hinzu. /de/images/list-dlls-loaded-when-the-powershell-process-start.png

Sie können beispielsweise den folgenden Befehl verwenden, um dem integrierten Windows Defender Antivirus Ausschlüsse hinzuzufügen:

Add-mppReference-exclusionsprozess" C: \ Windows \ System32 \ WindowsPowerShell \ V1.0 \ Powersshell.exe "," C: \ Programme \ PowerShell \ 7 \ pwsh.exe " ``

Wenn Sie den Verdacht haben, dass das langsame Start von PowerShell durch den Betrieb von Slow.net Framework Library verursacht wird, können Sie alle verwendeten Baugruppen mit dem Tool “ngen.exe” (nativer Bildgenerator) in nativen Maschinencode kompilieren. Dies wird die Leistung von Anwendungen von.NET, einschließlich PowerShell, erheblich verbessern:

`$ env: path = runtime.interopervices.Runtimeenvironment :: GetRuntimedirectory ()

Appdomain :: CurrentDomain.getassemblies () | Foreach-object {

$ path = $ _. Ort

if ($ path) {

$ name = split-path $ path-Leaf

Schreibhost-ForgroundColor Yellow “ rnrunning ngen.exe auf ‘$ name’ “ngen.exe install $ path/nologo

}

} `

/de/images/ngen-exe-regenerates-native-images-to-compiled.png

Das klassische Prozessmonitor -Tool kann auch verwendet werden, um die Startzeit von PowerShell zu analysieren. ( https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx). Führen Sie procmon64.exe aus, aktivieren Sie den Filter auf dem PowerShell.exe -Prozess, öffnen Sie die PS -Shell und identifizieren Sie die Operationen, die die größte Verzögerung verursachten.

/de/images/use-process-monitor-to-identify-the-cause-of-the-s.png

In meinem Beispiel dauerte das Lesen der vom PSReadline -Modul verwalteten Befehlsverlaufsdatei in der PowerShell -Befehlsverlauf etwa 30 Sekunden. (C: \ user \ userername \ appdata \ Roaming \ Microsoft \ Windows \ PowerShell \ Psreadline \ consolehost\_history.txt). Das Problem wurde durch die Datei consoleHost_history.txt mit einer Größe von 2 GB verursacht. Die Reinigung der Verlaufsdatei verringerte die Startzeit von PowerShell erheblich.

*️⃣ Quellverknüpfung:

Logon PowerShell-Skripte, die über GPO, Skripte in den geplanten Aufgaben gestartet wurden, History of PowerShell-Befehle, PowerShell-Kern, der integrierte Windows-Verteidiger Antivirus, https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx.aspx.aspx.aspx.aspx.,