在Windows中,可以使用PowerShell来迁移打印机设置,以下是用于导出和导入打印机配置的PowerShell代码示例。在Windows中,使用PowerShell批量安装网络打印机可以通过Add-Printer命令来实现。下面是一个示例脚本,展示了如何使用PowerShell批量安装多个网络打印机。

Windows PowerShell 打印机配置迁移完整解构文档

前置重要区分(两种迁移路线,底层完全不同)

Windows 存在两套主流打印机迁移方案,PowerShell 均可调用,底层链路、文件格式、能力差异巨大:
  1. 方案 A:PrintManagement 模块纯 PowerShell 命令(Get-Printer / Add-Printer + XML 序列化)
     
    轻量方案;仅导出元数据,不打包驱动文件;适合终端网络打印机批量部署。
  2. 方案 B:调用 PrintBrm.exe(Print Backup Restore Migration)生成 .printerExport(CAB 压缩包)
     
    微软官方打印迁移工具;完整打包:打印机队列、端口、驱动包、自定义纸张、打印首选项、安全权限;打印服务器迁移首选。
核心底层根基:所有打印机配置最终由 Print Spooler(spoolsv.exe) 维护,配置持久化存储在系统注册表。

一、完整调用栈树形链路

链路 1:PrintManagement 原生 Cmdlet 路线(XML 方式)

plaintext
管理员 PowerShell
        ↓ Import-Module PrintManagement
        ↓ Get-Printer / Get-PrinterPort / Get-PrinterDriver
        ↓ PrintManagement.dll(PowerShell托管命令集封装)
        ↓ winspool.drv(Win32打印原生API:OpenPrinter、EnumPrinters、AddPrinter)
        ↓ RPC IPC通信
        ↓ spoolsv.exe(Print Spooler打印后台处理程序)
        ├─读取注册表 HKLM\SYSTEM\CurrentControlSet\Control\Print
        └─加载端口监视器(tcpmon.dll/usbmon.dll)、打印处理器

链路 2:PrintBrm.exe 完整迁移路线(.printerExport)

plaintext
PowerShell进程
        ↓ 启动外部进程 PrintBrm.exe
        ↓ brmui.dll / printui.dll(打印迁移核心逻辑)
        ↓ winspool.drv Win32 Print API
        ↓ spoolsv.exe
        ↓ 读取注册表 + 读取驱动仓库文件
        ↓ 打包生成CAB格式 .printerExport
导入反向执行:解压CAB → 写入注册表 → 注册驱动 → 创建端口 → 创建打印机队列

二、核心组件清单与定位

1. PowerShell 模块:PrintManagement

系统内置模块,无需额外安装(Win8.1/Server2012R2+)
 
模块文件路径:
 
C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PrintManagement
 
核心二进制:PrintManagement.dll(托管 C# 程序集,封装 Win32 打印 API)
核心迁移相关 Cmdlet
命令 作用 底层能力边界
Get-Printer 枚举本地打印机队列 仅读取注册表元数据
Get-PrinterPort 枚举 TCP/USB/WSD 端口配置 获取端口 IP、超时、协议参数
Get-PrinterDriver 枚举已安装打印驱动信息 仅获取名称、版本,不导出驱动文件
Add-PrinterPort 创建打印端口 导入时必须优先执行
Add-PrinterDriver 注册驱动至系统驱动库 需要提前准备驱动 INF
Add-Printer 创建打印机队列,绑定端口与驱动 无法自动安装缺失驱动

2. 底层原生系统 DLL

  1. winspool.drv
     
    Windows 打印体系顶层 Win32 API 提供程序;所有枚举、增删打印机、端口操作的标准入口。
  2. printui.dll
     
    打印机属性对话框、驱动安装、单台打印机配置导入导出(/Ss/Sr 导出.drs驱动首选项文件)。
  3. localspl.dll
     
    spoolsv 内部本地打印服务逻辑。
  4. tcpmon.dll / usbmon.dll / localmon.dll
     
    端口监视器,管理 TCP/IP、USB、本地端口通信。

3. 独立迁移工具 PrintBrm.exe

路径:C:\Windows\System32\spool\tools\PrintBrm.exe
 
由打印管理(printmanagement.msc)图形界面后台调用;
 
输出文件:.printerExport,标准 CAB 压缩包,内部包含:注册表快照、驱动文件、配置清单。

三、持久化存储载体(所有打印机配置源头)

主注册表路径(核心数据源)

plaintext
HKLM\SYSTEM\CurrentControlSet\Control\Print
├─ Printers          所有本地打印机队列、共享设置、ACL权限
├─ Ports             TCP/IP、USB、LPT端口参数
├─ Environments      x64/x86 打印驱动注册信息
├─ Monitors          已加载端口监视器列表
├─ Forms             自定义纸张尺寸(标签、特殊版式)
└─ Providers         网络打印提供程序
用户层面连接的网络共享打印机存储位置:
 
HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows\Printer Connections

文件系统存储

  1. 驱动仓库:C:\Windows\System32\spool\DRIVERS
  2. 打印作业缓存:C:\Windows\System32\spool\PRINTERS(临时打印任务,迁移不包含)
  3. 日志路径:C:\Windows\System32\spool\LOGS

四、两种迁移方案完整数据流对比

方案 A:PrintManagement + Export-Clixml(轻量元数据迁移)

导出流程

  1. Get-Printer 通过 winspool.drv 从 spoolsv 读取注册表打印机对象
  2. PowerShell 序列化对象 → 输出 XML 文本
     
    ✅ 包含:打印机名称、驱动名、端口名、共享状态、默认首选项元数据
     
    ❌ 不包含驱动二进制文件、自定义纸张、端口完整高级参数、安全 ACL

导入流程

  1. Import-Clixml 读取 XML 对象
  2. 必须先执行 Add-PrinterPort 创建端口
  3. 必须提前手动安装对应驱动 Add-PrinterDriver
  4. Add-Printer 创建打印机队列,绑定端口与驱动
典型脚本模板
powershell
#导出
Get-Printer | Where-Object {$_.Type -eq "Local"} | Export-Clixml "C:\printer_backup.xml"
#导入
$printerList = Import-Clixml "C:\printer_backup.xml"
foreach($p in $printerList){
    Add-Printer -Name $p.Name -DriverName $p.DriverName -PortName $p.PortName
}

方案 B:PowerShell 调用 PrintBrm.exe(完整企业级迁移)

导出时序

  1. PowerShell 启动 PrintBrm.exe
  2. PrintBrm 通过 winspool.drv 向 spoolsv 读取全部打印配置
  3. 读取 spool\DRIVERS 驱动文件、注册表快照
  4. 打包为 CAB .printerExport
powershell
#导出
& "C:\Windows\System32\spool\tools\PrintBrm.exe" -s localhost -b -f "C:\print_backup.printerExport"
#导入
& "C:\Windows\System32\spool\tools\PrintBrm.exe" -s localhost -r -f "C:\print_backup.printerExport"
✅ 包含:端口、驱动包、打印机队列、自定义纸张、安全权限、打印首选项
 
⚠️ 限制:架构必须一致(64 位→64 位);跨系统版本迁移仍可能出现 V4 驱动兼容问题。

五、依赖配套链汇总

强制运行依赖

  1. 服务:Print Spooler (spoolsv)
     
    服务停止 → winspool.drv API 全部调用失败,所有打印机命令失效。
  2. RpcSs(远程过程调用)
     
    spoolsv 依赖 RPC 进行本地 IPC 通信。
  3. 权限
     
    添加端口、安装驱动、创建本地打印机、PrintBrm 还原必须管理员权限。

组件依赖层级

  • 上层:PowerShell → PrintManagement.dll
  • API 层:winspool.drv
  • IPC 层:rpcrt4.dll
  • 服务宿主:spoolsv.exe
  • 硬件通信层:tcpmon.dll/usbmon.dll 等端口监视器

六、两种迁移方案优缺点对比

维度 PrintManagement + XML PrintBrm.exe (.printerExport)
是否自带驱动文件 ❌ ✅
自定义纸张迁移 ❌ ✅
端口完整高级参数 部分丢失 完整保留
安全 ACL 权限 ❌ ✅
使用场景 终端网络打印机标准化部署 打印服务器整机迁移、系统重装
跨机器约束 目标机器提前装好驱动 架构一致即可自动安装驱动

七、底层关键约束与排障模型

  1. XML 方式导入常见失败
     
    根因:只导入元数据,目标机器缺少驱动 / 端口未预先创建;
     
    解决:先批量创建端口、部署驱动,再创建打印机。
  2. PrintBrm 导入失败
    • 源与目标系统位数不一致(32/64 不互通)
    • spoolsv 正在占用驱动文件
    • 目标存在同名打印机冲突
    • V4 打印驱动依赖系统内置扩展缺失
  3. 只能迁移队列,无法迁移用户网络打印机连接
     
    Get-Printer 默认读取本地打印机;用户映射的共享打印机存储在 HKCU,需要单独枚举注册表处理。
  4. 打印机首选项深浅两层区分
    • 队列默认首选项:存储在打印机注册表,可以迁移
    • 当前用户个性化打印首选项:存储在 HKCU,两套方案均无法迁移,需要额外使用printui.dll,PrintUIEntry /Ss导出.drs文件。

八、延伸补充:单台打印机驱动首选项独立导出(printui.dll)

powershell
#导出单台打印机用户首选项
rundll32 printui.dll,PrintUIEntry /Ss /n "打印机名称" /a "C:\setting.drs"
#导入
rundll32 printui.dll,PrintUIEntry /Sr /n "打印机名称" /a "C:\setting.drs"
链路:PowerShell → rundll32 → printui.dll → winspool.drv → spoolsv。
 

在Windows中,可以使用PowerShell来迁移打印机设置,以下是用于导出和导入打印机配置的PowerShell代码示例。

导出打印机设置

使用以下命令导出当前打印机设置到一个文件:

powershellCopy Code
Get-Printer | Export-Clixml -Path "C:\path\to\exported_printers.xml"

导入打印机设置

使用以下命令从导出的文件中导入打印机设置:

powershellCopy Code
$printers = Import-Clixml -Path "C:\path\to\exported_printers.xml"
foreach ($printer in $printers) {
    Add-Printer -Name $printer.Name -DriverName $printer.DriverName -PortName $printer.PortName
}

说明

  • 导出命令:

    • Get-Printer:获取当前系统中所有的打印机。
    • Export-Clixml:将获取到的打印机信息导出为XML格式,便于后续导入。
  • 导入命令:

    • Import-Clixml:从指定的XML文件中导入打印机设置。
    • Add-Printer:将导入的打印机信息添加到新的系统中。

注意事项

  1. 文件路径:确保在运行脚本之前将C:\path\to\替换为实际的文件路径。
  2. 管理员权限:有些操作需要管理员权限,确保以管理员身份运行PowerShell。
  3. 驱动程序:导入打印机时,确保目标计算机上已经安装了所需的打印机驱动程序。
  4. 端口:如果打印机使用特定端口(如TCP/IP),可能需要额外配置端口。

使用这些命令可以简化打印机的迁移过程,提高工作效率。


在Windows中,使用PowerShell批量安装网络打印机可以通过Add-Printer命令来实现。下面是一个示例脚本,展示了如何使用PowerShell批量安装多个网络打印机。

示例 PowerShell 脚本

以下是一个示例脚本,它通过循环遍历打印机列表来安装网络打印机:

powershellCopy Code
# 定义网络打印机的名称和其对应的IP地址或主机名
$printers = @(
    @{ Name = "Printer1"; Port = "192.168.1.10"; Driver = "HP Universal Printing PCL 6" },
    @{ Name = "Printer2"; Port = "192.168.1.11"; Driver = "Brother HL-L8360CDW" },
    @{ Name = "Printer3"; Port = "192.168.1.12"; Driver = "Canon Generic Plus PCL6" }
)

# 循环遍历打印机列表,添加打印机
foreach ($printer in $printers) {
    # 添加 TCP/IP 打印机端口
    $portExists = Get-PrinterPort | Where-Object { $_.Name -eq $printer.Port }
    if (-not $portExists) {
        New-PrinterPort -Name $printer.Port -PrinterHostAddress $printer.Port
    }

    # 添加打印机
    $printerExists = Get-Printer | Where-Object { $_.Name -eq $printer.Name }
    if (-not $printerExists) {
        Add-Printer -Name $printer.Name -DriverName $printer.Driver -PortName $printer.Port
        Write-Host "已添加打印机: $($printer.Name)"
    } else {
        Write-Host "打印机已存在: $($printer.Name)"
    }
}

说明

  1. 打印机列表:在脚本开头,您可以自定义打印机的名称、端口和驱动程序。每个打印机的配置都以哈希表的形式存储在数组中。

  2. 添加打印机端口:

    • 使用Get-PrinterPort检查打印机端口是否已存在。
    • 如果端口不存在,使用New-PrinterPort创建新的TCP/IP打印机端口。
  3. 添加打印机:

    • 使用Get-Printer检查打印机是否已存在。
    • 如果打印机不存在,使用Add-Printer添加打印机。
  4. 驱动程序:确保在目标计算机上已安装所需的打印机驱动程序。

  5. 管理员权限:某些命令可能需要管理员权限,确保以管理员身份运行PowerShell。

执行脚本

  • 将上面的代码复制到一个.ps1文件中,例如Add-NetworkPrinters.ps1。
  • 右键单击该文件,选择“以管理员身份运行”,或在PowerShell中导航到文件路径并输入:
powershellCopy Code
.\Add-NetworkPrinters.ps1

此脚本将批量安装您定义的所有网络打印机。确保在使用之前根据实际情况更新打印机的名称、端口和驱动程序。


 

posted @ 2024-10-24 11:41  suv789  阅读(481)  评论(0)    收藏  举报