
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 ngen
em cada assembly que o PowerShell foi carregado, o que eu quero fazer é executar ngen update
o 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