我在 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.exe
了Windows 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 更新。
我不想在每个已加载的程序集上运行ngen
powershell,而是想要运行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