Inicio lento de Powershell en Windows 10

Inicio lento de Powershell en Windows 10

Tengo un problema con el inicio lento del indicador de PowerShell en Windows 10 (Versión 1703 - Actualización de creadores).

Mis especificaciones de hardware (máquina bastante rápida): Intel i5-7440HQ (Quad Core) / 32 GB DDR4 RAM / 512 disco duro Samsung SSD.

Intenté omitir el perfil y la política de ejecución pero no cambia nada:

powershell -noprofile -ExecutionPolicy Bypass ( Medida-Comando { powershell "Write-Host 1" } ).TotalSeconds

6,228067

La misma computadora portátil de mis amigos con Windows 10 sin Creators Update ejecuta PowerShell en menos de 0,5 segundos.

También intenté hacer una compilación con ngen.exe pero no ayudó:

$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$_"}
}

¿Alguna idea de cómo puedo investigar este problema?

Saludos

Respuesta1

Esto también me estaba pasando a mí, aunque tal vez no sea la mejor opción, ya que se suma powershell.exea la lista deExclusiones de Windows Defenderlo aceleró de 20 segundos a <1 segundo.

Usar la consola heredada, purgar PSReadLine y ejecutar ngen no pareció ayudar en absoluto.

Respuesta2

Había estado experimentando el mismo problema durante bastante tiempo hasta que PowerShell comenzó a fallar al iniciar con el siguiente error:

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)
-----------------------------------------------------------------------

Esto me llevó al problema existente de Github:https://github.com/Powershell/PSReadLine/issues/673

Intenté eliminar el archivo de historial ~\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\que en ese momento tenía más de 6 GB y luego la consola PowerShell comenzó a abrirse con bastante rapidez.

Tal vez la lentitud que experimenta se deba a que PowerShell intenta leer un archivo de historial grande (que aún no es lo suficientemente grande como para causar problemas OutOfMemory).

Respuesta3

Puede haber otras razones que causen el inicio lento de Powershell, pero algo quesiempreLo que me ralentiza es la actualización de Windows.

En lugar de ejecutar ngenen cada ensamblaje que PowerShell haya cargado, lo que quiero hacer es ejecutarlo, ngen updatelo que optimiza cada ensamblaje instalado globalmente:

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

Después de actualizar a Win10 de mayo de 2019, veo que mejoró el rendimiento de

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

de ~1,35s a ~0,55s.

Respuesta4

Después de analizar powershell.exe con procmon (herramienta sysinternals), pude ver que el proceso estaba intentando hacer algo en la carpeta catroot2, así que después de cambiarle el nombre (debe detener el servicio CryptSvc que bloquea la carpeta), se creó automáticamente. Entonces la conclusión es que esa carpeta se corrompió. (Perdón por mi mal ingles)

Ejecute el siguiente .bat

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

información relacionada