我最近买了一台性能强大的新电脑,除了 PowerShell 之外,它在其他地方运行速度都非常快。
环境:
- 戴尔 XPS 8930(i7-8700K、32GB RAM、1TB NVMe SSD)
- 带有最新更新的 Windows 10 Pro(1809/10.0.17763)
- PowerShell 5.1.17763.316 和 PowerShell Core 6.1.1
- 我有足够的剩余内存(> 16GB)并且当它挂起时 CPU 几乎处于空闲状态。
- 仅 Windows Defender(无其他防病毒软件)
一些症状似乎是一致的:
- 打开 PowerShell 会显示版权信息,并在那里挂起 2 分钟,然后才显示提示。
- 我开始输入命令,大约一分钟后文本才出现
- 一旦文本出现,我就可以修改命令并且它会做出响应。
- 我输入一个简单的命令,例如,
echo 'hello'
然后按回车键,大约需要 45 秒的时间“hello”才会出现在屏幕上,再过 45 秒才会返回提示符。 - 一旦在提示符下输入命令就会有响应,但运行起来又很慢。
- 在我的主目录(一些文件/文件夹)中运行该
dir
命令:在列出目录之前大约 2:30,再过 15 秒即可返回到提示符。
一些尝试排除故障的方法:
- PowerShell ISE:大约需要 5 分钟才能得到提示。
- PowerShell ISE (x86):运行速度很快!
- PowerShell (x86):运行速度也很快!
- PowerShell Core:也非常慢。
- PowerShell 旧控制台:没有变化。
- 打开常规命令行并运行
powershell -NoProfile
:没有变化。 sfc /scannow
:未发现任何问题,重新启动也无济于事。- 禁用网络连接:没有变化。
- 运行 Sysinternals procmon:没什么明显的,但它似乎总是在某些“线程退出”操作之后挂起。
- 查看 Sysinternals procexp 中的线程堆栈:当它挂起时,主线程始终位于 ntdll.dll
ZwWaitForMultipleObjects
。 - 卸载 WSL/Hyper-V:没有变化。
- 运行“Microsoft .NET Framework 修复工具”并重新启动,没有变化。
- 检查一下
C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline
,只有一个4KB文件。 $PSModuleAutoloadingPreference = 'none'
:没有变化。我无法想象运行诸如echo
多次这样的基本命令总是会尝试加载模块。netsh http show iplist
:
IP 侦听列表中存在的 IP 地址:
127.0.0.1
- 启用 WinRM(
winrm quickconfig
):服务已启动,但无法连接。- 我可以看到服务启动时 PID 4 正在监听端口 5985。
- Windows 防火墙有两个针对端口 5985 的“Windows 远程管理(HTTP-In)”条目(在私有网络/配置文件中时允许任何远程地址)。
- 我可以成功地
telnet localhost 5985
- WinRM 服务启动后,大约需要 7 分钟才能响应:
WSManFault ...
错误号:-2144108250 0x80338126 WinRM 无法完成操作。请验证指定的计算机名称是否有效、计算机是否可通过网络访问,以及 WinRM 服务的防火墙例外是否已启用并允许从此计算机进行访问。默认情况下,公共配置文件的 WinRM 防火墙例外会限制对同一本地子网内的远程计算机的访问。
延迟的一致性让我怀疑存在某种类型的尝试连接和超时,但我不知道那可能是什么。有没有什么高手可以给出建议?
答案1
可能已安装其他 64 位产品,导致 PowerShell 运行缓慢。要检查, 启动到安全模式 禁用所有第三方产品和驱动程序。如果问题消失,您可以使用 自动运行 批量禁用启动应用程序并重新启动,直到找到正确的应用程序。
另一种可能是,延迟是由您安装的某些 64 位附加组件引起的。这里要使用的工具是 进程探索器 比较 64 位和 32 位版本 PowerShell 使用的 DLL。
在 Process Explorer 的“查看”菜单中,启用“显示下方窗格”,然后在“下方窗格视图 > DLL”中选择“DLL”。使用Ctrl+A将列表保存为文本文件,然后使用文件比较产品在排序后比较两个结果。您可以通过将显示的列表限制为仅 DLL 的名称来简化搜索,方法是右键单击标题并选择“选择列...”。
答案2
我有带勒索软件保护功能的 Acronis True Image。我发现 True Image 有些漏洞/不可靠,所以如果它是罪魁祸首,我一点也不惊讶。
我也安装了它。它不是罪魁祸首。
当我运行时,netsh http show iplist
它显示以下信息。
IP addresses present in the IP listen list:
-------------------------------------------
这是运行命令时应该显示的内容。
有没有一些大师有自己的想法?
您需要在提升的 PowerShell 提示符中运行以下命令。
netsh http delete iplisten ipaddress=127.0.0.1
立即输出netstat -anp tcp
以下内容:
> PS C:\> netstat -anp tcp
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:903 0.0.0.0:0 LISTENING
TCP 0.0.0.0:913 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49664 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49665 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49666 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49667 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49759 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49830 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49921 0.0.0.0:0 LISTENING
TCP 0.0.0.0:54235 0.0.0.0:0 LISTENING
TCP 0.0.0.0:54236 0.0.0.0:0 LISTENING
TCP 0.0.0.0:58091 0.0.0.0:0 LISTENING
TCP 0.0.0.0:58101 0.0.0.0:0 LISTENING
TCP 0.0.0.0:58607 0.0.0.0:0 LISTENING
TCP 0.0.0.0:62401 0.0.0.0:0 LISTENING
TCP 127.0.0.1:843 0.0.0.0:0 LISTENING
TCP 127.0.0.1:1120 0.0.0.0:0 LISTENING
TCP 192.168.0.11:64811 24.105.29.76:443 ESTABLISHED
TCP 192.168.0.11:64828 52.114.76.37:443 TIME_WAIT
TCP 192.168.0.11:65133 23.79.18.217:443 CLOSE_WAIT
TCP 192.168.0.11:65135 17.248.136.9:443 CLOSE_WAIT
TCP 192.168.120.1:139 0.0.0.0:0 LISTENING
TCP 192.168.174.1:139 0.0.0.0:0 LISTENING
答案3
感谢防病毒评论https://stackoverflow.com/questions/45021585/powershell-hangs-on-launch!我安装了 Bitdefender Antivirus。禁用它不能解决问题,但卸载可以。我尝试重新安装,问题再次出现。将所有内容添加C:\
到排除列表也不能解决问题。
2/20更新:我仍未安装 Bitdefender Antivirus,但问题几周前又再次出现。
答案4
我也遇到过类似的问题。我认为 powershell 在启动时尝试加载资源时会出现问题。我不确定是否有某种方法可以禁用该功能。我发现如果我在启动后输入Ctrl+,C它从那时起就可以正常工作。第一次使用 tab 自动完成某些操作时,确实需要 1-2 秒才能加载,但除此之外我现在没有任何问题。我不确定它会加载什么其他资源,但这是唯一有意义的事情,因为这会影响我跨计算机。
PS 不要在第一秒左右开始按Ctrl+ C,否则会完全关闭程序。另外,如果这个答案对其他人不起作用,请告诉我,我会删除它。