Powershell startet langsam unter Windows 10

Powershell startet langsam unter Windows 10

Ich habe ein Problem mit dem langsamen Starten der Powershell-Eingabeaufforderung unter Windows 10 (Version 1703 – Creators Update).

Meine Hardware-Spezifikationen (ziemlich schnelle Maschine): Intel i5-7440HQ (Quad Core) / 32 GB DDR4 RAM / 512 Samsung SSD-Festplatte.

Ich habe versucht, das Profil und die Ausführungsrichtlinie zu umgehen, aber es ändert sich nichts:

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

6,228067

Auf dem gleichen Laptop meines Freundes mit Windows 10 ohne Creators Update läuft Powershell in weniger als 0,5 Sekunden.

Habe auch versucht, eine Kompilierung mit ngen.exe durchzuführen, aber das hat nicht geholfen:

$env:path = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblies() | % {
  if (! $_.location) {continue}
  $Name = Split-Path $_.location -leaf
  Write-Host -ForegroundColor Yellow "NGENing : $Name"
  ngen install $_.location | % {"`t$_"}
}

Irgendeine Idee, wie ich dieses Problem untersuchen kann?

Grüße

Antwort1

Das ist mir auch passiert - obwohl es vielleicht nicht der beste Weg ist, und ergänzt powershell.exedie Liste derWindows Defender-Ausnahmenvon 20 Sekunden auf < 1 Sekunde beschleunigt.

Die Verwendung der Legacy-Konsole, das Löschen von PSReadLine und das Ausführen von ngen schienen überhaupt nicht zu helfen.

Antwort2

Ich hatte ziemlich lange dasselbe Problem, bis PowerShell beim Start mit dem folgenden Fehler abstürzte:

Exception:
System.OutOfMemoryException: Array dimensions exceeded supported range.
   at System.Collections.Generic.List`1.set_Capacity(Int32 value)
   at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
   at System.Collections.Generic.List`1.Add(T item)
   at System.IO.File.InternalReadAllLines(String path, Encoding encoding)
   at Microsoft.PowerShell.PSConsoleReadLine.<ReadHistoryFile>b__67_0()
   at Microsoft.PowerShell.PSConsoleReadLine.WithHistoryFileMutexDo(Int32 timeout, Action action)
   at Microsoft.PowerShell.PSConsoleReadLine.DelayedOneTimeInitialize()
   at Microsoft.PowerShell.PSConsoleReadLine.Initialize(Runspace runspace, EngineIntrinsics engineIntrinsics)
   at Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------

Dies führte mich zum bestehenden Github-Problem:https://github.com/Powershell/PSReadLine/issues/673

Ich habe versucht, die Verlaufsdatei zu löschen, ~\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\die zu diesem Zeitpunkt über 6 GB groß war, und danach begann sich die PowerShell-Konsole ziemlich schnell zu öffnen.

Die von Ihnen festgestellte Langsamkeit liegt möglicherweise daran, dass PowerShell versucht, eine große Verlaufsdatei zu lesen (die noch nicht groß genug ist, um Probleme zu verursachen OutOfMemory).

Antwort3

Es kann andere Gründe für den langsamen Start von Powershell geben, aber etwas, dasstetsDie Ursache für die Verlangsamung ist bei mir Windows Update.

Anstatt es ngenauf jeder Assembly auszuführen, die Powershell zufällig geladen hat, möchte ich Folgendes ausführen, ngen updatewas jede global installierte Assembly optimiert:

. (Join-Path ([Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()) ngen.exe) update

Nach dem Update auf Mai 2019 Win10 sehe ich, dass die Leistung von

(measure-command { powershell.exe -command "1+1" }).TotalSeconds

von ~1,35 s bis ~0,55 s.

Antwort4

Nachdem ich powershell.exe mit procmon (Sysinternals-Tool) analysiert hatte, konnte ich sehen, dass der Prozess versuchte, etwas im Ordner catroot2 zu tun. Nachdem ich ihn umbenannt hatte (Sie müssen den CryptSvc-Dienst stoppen, der den Ordner blockiert), wurde er automatisch erstellt. Die Schlussfolgerung ist also, dass der Ordner beschädigt wurde. (Entschuldigen Sie mein schlechtes Englisch)

Führen Sie die nächste .bat-Datei aus

net stop CryptSvc /y
rename c:\windows\system32\catroot2 Catroot2.bak
net start CryptSvc

verwandte Informationen