你好 林QC,感谢您在 Microsoft Q&A 社区发帖。
这是 Windows 的即插即用(PnP)以及 USB 驱动程序堆栈的默认行为。当设备通过 USB 连接时,Windows 会读取其硬件 ID(VID/PID)和序列号 (Serial Number)。由于产线上的每台打印机都具有独一无二的硬件序列号,Windows 会将其识别为一台“全新”的物理设备,并在注册表(如 HKLM\SYSTEM\CurrentControlSet\Enum\USBPRINT)和打印后台处理程序中为其创建一个新的设备实例和打印队列。当这些枚举实例累积到一定数量(通常在 200~300 个左右)时,打印子系统的资源或相关注册表项会变得极度臃肿,最终触及系统处理上限,导致无法添加新驱动或导致 Spooler 服务挂起。
为了解决并在未来预防此问题,我为您提供以下两套解决方案:
批量清理重复打印机驱动及队列 (自动化清理工具) 针对目前已经产生大量副本的测试机,我们可以通过 PowerShell 脚本进行安全、批量的清理,从而无需重装整个操作系统。
操作步骤:
- 点击“开始”菜单,搜索 PowerShell,右键选择“以管理员身份运行”。
- 运行以下 PowerShell 脚本。该脚本会自动寻找并清理名称中包含“副本”或特殊数字后缀的打印机队列:
# 1. 停止打印后台处理程序服务以释放部分注册表锁定
Stop-Service -Name Spooler -Force
# 2. 重新启动服务以供后续管理命令调用
Start-Service -Name Spooler
# 3. 批量删除名称中带有“副本”字样的打印机
# 警告: 建议先执行 Get-Printer | Where-Object { $_.Name -match "副本" } 确认将要删除的列表
Get-Printer | Where-Object { $_.Name -match "副本" } | Remove-Printer
# 补充: 如果您的系统语言为英文或生成格式为 "#数字" (例如 Printer #2),可使用以下命令:
Get-Printer | Where-Object { $_.Name -match "#\d+$" } | Remove-Printer
如果清理队列后仍无法添加新打印机,说明底层 PnP 枚举设备也已满载。可以使用系统内置的 pnputil 工具找出并清理已断开连接的“幽灵”设备实例:
# 移除所有当前未连接的打印机设备实例 (仅作枚举演示,具体需通过脚本循环删除)
pnputil /enum-devices /class Printer /disconnected
如果在配置了“忽略序列号”的注册表后,系统中仍然会产生新的设备副本,这说明该打印机的驱动程序可能使用了非标准的通信协议或特殊端口监视器。为了让我能提供更深度的帮助,请您在回复中提供:
- 打印机在设备管理器中的具体 硬件 ID (VID/PID)。
- 能够触发问题的驱动名称及生成的“副本”打印机全名的具体格式(如有截图最佳)。