
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.exe
a 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 ngen
en cada ensamblaje que PowerShell haya cargado, lo que quiero hacer es ejecutarlo, ngen update
lo 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