Powershell 在 Windows 10 上启动缓慢

Powershell 在 Windows 10 上启动缓慢

我在 Windows 10(版本 1703 - Creators Update)上遇到了 powershell 提示符启动缓慢的问题。

我的硬件规格(相当快的机器):Intel i5-7440HQ(四核)/ 32GB DDR4 RAM / 512 三星 SSD 硬盘。

我试图绕过配置文件和执行策略,但它并没有改变任何东西:

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

6,228067

我朋友的笔记本电脑也安装了 Windows 10(未安装 Creators Update),运行 powershell 只需不到 0.5 秒。

还尝试使用 ngen.exe 进行一些编译,但没有帮助:

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

我知道该如何调查这个问题吗?

问候

答案1

我也遇到过这种情况 - 虽然可能不是最好的方法,但还是加入powershell.exeWindows Defender 排除从 20 秒加速到不到 1 秒。

使用旧版控制台、清除 PSReadLine 和运行 ngen 似乎根本没有帮助。

答案2

我遇到同样的问题已经有一段时间了,直到 PowerShell 启动时失败并出现以下错误:

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

这让我想到了 Github 上现有的问题:https://github.com/Powershell/PSReadLine/issues/673

我尝试删除~\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\超过 6 GB 的历史文件,之后 PowerShell 控制台开始很快打开。

也许您所体验到的缓慢是因为 PowerShell 试图读取一个很大的历史文件(该文件还不够大,不会引起OutOfMemory)。

答案3

导致 Powershell 启动缓慢的原因可能还有其他,但总是导致我速度变慢的原因是 Windows 更新。

我不想在每个已加载的程序集上运行ngenpowershell,而是想要运行ngen update优化每个全局安装的程序集的程序集:

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

更新到 2019 年 5 月版 Win10 后,我发现

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

从~1.35秒到~0.55秒。

答案4

使用 procmon(sysinternals 工具)分析 powershell.exe 后,我发现该进程正在尝试在 catroot2 文件夹中执行某些操作,因此在重命名该文件夹后(您必须停止阻止该文件夹的 CryptSvc 服务),它会自动创建。所以结论是该文件夹已损坏。(抱歉我的英语不好)

执行下一个.bat

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

相关内容