
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

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

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

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 *

Ü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. 
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 ‘;’ '

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

Ü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
}
} `

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.

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.
-
Öffnen Sie
cmd.exeund führen Sie den Befehl aus:PowerShell.exe-c" Schreibweih $ pid; Start-Sleep-S 60 " -
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. 
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
}
} `

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.

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.,