Powershell inicia lentamente no Windows 10

Powershell inicia lentamente no Windows 10

Tenho problemas com a inicialização lenta do prompt do PowerShell no Windows 10 (versão 1703 - Atualização para criadores).

Minhas especificações de hardware (máquina bastante rápida): Intel i5-7440HQ (Quad Core) / 32 GB de RAM DDR4 / disco rígido SSD de 512 Samsung.

Tentei ignorar o perfil e a política de execução, mas isso não mudou nada:

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

6.228067

O mesmo laptop dos meus amigos com Windows 10 sem Atualização para Criadores executa o PowerShell em menos de 0,5 segundos.

Também tentei fazer alguma compilação com ngen.exe, mas não ajudou:

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

Alguma ideia de como posso investigar esse problema?

Saudações

Responder1

Isso também estava acontecendo comigo - embora talvez não seja o melhor caminho, acrescentando powershell.exeà lista deExclusões do Windows Defenderacelerou de 20 segundos para <1 segundo.

Usar o console legado, limpar o PSReadLine e executar o ngen não pareceu ajudar em nada.

Responder2

Eu estava enfrentando o mesmo problema há algum tempo, até que o PowerShell começou a falhar na inicialização com o seguinte erro:

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

Isso me levou ao problema existente do Github:https://github.com/Powershell/PSReadLine/issues/673

Tentei excluir o arquivo de histórico ~\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\que já tinha mais de 6 GB e depois disso o console do PowerShell começou a abrir rapidamente.

Talvez a lentidão que você enfrenta seja o PowerShell tentando ler um grande arquivo de histórico (que ainda não é grande o suficiente para causar OutOfMemory).

Responder3

Pode haver outras razões para o início lento do Powershell, mas algo quesemprecausa lentidão para mim é a atualização do Windows.

Em vez de executar ngenem cada assembly que o PowerShell foi carregado, o que eu quero fazer é executar ngen updateo que otimiza cada assembly instalado globalmente:

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

Depois de atualizar para o Win10 de maio de 2019, vejo que melhorou o desempenho do

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

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

Responder4

Após analisar powershell.exe com procmon (ferramenta sysinternals) pude perceber que o processo estava tentando fazer algo na pasta catroot2, então após renomeá-lo (é necessário parar o serviço CryptSvc que bloqueia a pasta), ele foi criado automaticamente. Portanto, a conclusão é que a pasta foi corrompida. (Desculpe pelo meu péssimo inglês)

Execute o próximo .bat

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

informação relacionada