Printers(一) 打印机配置信息

单元名

uses printers;

1、获取控制面板中的打印机列表

Printer.Printers  ;// 返回值类型 TStrings

2、设置打印机的打印属性 打印方向 自定义纸张大小

//参数:lpname  表示指定打印机名字  ''表示非默认打印机
procedure setPrinterInfo(lpname string) ;
var
  ADevice, ADriver, APort: PChar;
  ADeviceMode: THandle ;
  PDMode: PDEVMODE;
  Anew :boolean ;
begin
  GetMem(ADevice,cchDeviceName);
  GetMem(ADriver,MAX_PATH);
  GetMem(APort,MAX_PATH);
  try
      try
          with printer do
          begin
              ////判定打印机是否切换
              if (lpname <>'') then
              begin 
                  Anew := false;
                  if printerindex <> printer.printers.indexof(lpname ) then
                     Anew := true ;
                  printerindex := printer.printers.indexof(lpname ) ;
              end;
              GetPrinter(ADevice, ADriver, APort,ADeviceMode);
              /**B 针对打印机切换时使用******************************/
              //例如将默认打印机切换到非默认打印机
              //GetNew_DeviceMode 自定义函数,位置UnitPrinterZDY单元中。
              if Anew then
              begin
                ADeviceMode := GetNew_DeviceMode(ADevice) ; 
              end;
              /**E**********************************************/
              if ADeviceMode <>  0 then
              begin
                pDMode  :=  GlobalLock(ADeviceMode);
                if pDMode <>  nil then
                begin
                  pDMode^.dmFields:=pDMode^.dmFields or   DM_ORIENTATION;
                  //设定打印方向横向打印
                  pDMode^.DMORIENTATION:=   DMORIENT_LANDSCAPE ;
                end;
                SetPrinter(ADevice,ADriver,APort, ADeviceMode);
                GlobalUnlock(ADeviceMode);
              end;

              /**开始打印*******/
              BeginDoc ;
              //此处打印内容
              EndDoc ;
              /**结束打印*******/
          end;
      except
      Application.MessageBox('设置失败','提示',MB_OK);
    end;
  finally
    FreeMem(ADevice,cchDeviceName);
    FreeMem(ADriver,MAX_PATH);
    FreeMem(APort,MAX_PATH);
  end;
end ;
unit UnitPrinterZDY;

interface

uses Windows,winspool ;

function GetNew_DeviceMode(ADevice : PChar ) : THandle;

implementation

function GetNew_DeviceMode(ADevice : PChar ) : THandle;
var
  StubDevMode: TDeviceMode;
  FPrinterHandle: THandle;
  DeviceMode: THandle;
  DevMode: PDeviceMode;
begin
  DeviceMode := 0 ;
  if OpenPrinter(ADevice, FPrinterHandle, nil) then
  begin
    DeviceMode := GlobalAlloc(GHND,
      DocumentProperties(0, FPrinterHandle, ADevice, StubDevMode,
      StubDevMode, 0));
    if DeviceMode <> 0 then
    begin
      DevMode := GlobalLock(DeviceMode);
      if DocumentProperties(0, FPrinterHandle, ADevice, DevMode^,
        DevMode^, DM_OUT_BUFFER) < 0 then
      begin
        GlobalUnlock(DeviceMode);
        GlobalFree(DeviceMode);
        DeviceMode := 0;
        DevMode := nil;
      end
    end;
  end;
  result := DeviceMode ;
end ;

end.
<think>嗯,用户这次问的是DOS批处理脚本调用打印机配置文件的具体方法。从对话历史看,我之前已经解释了Windows命令行管理打印机的原理,但用户似乎需要更具体的操作示例。用户提到的两个引用都很有意思:引用[1]关于Samba打印机删除的说明虽然不直接相关,但提醒我要强调Windows和Linux打印机管理的区别;引用[2]提到的stty命令明显是Linux环境下的,更印证了用户可能在跨系统操作上存在混淆。用户真正需要的可能是:在纯Windows环境下,如何用批处理脚本自动化配置打印机参数。考虑到他提到“配置文件”,重点应该是如何批量应用预设的打印机设置。这其实涉及两个层面:驱动安装和首选项配置。让我拆解这个需求:第打印机驱动部署可以通过pnputil实现,特别是批量安装INF驱动文件的情况。需要提醒用户注意驱动签名验证。第二,针对已安装的打印机,最可靠的是调用printbrm.exe这个备份还原工具,这是微软官方推荐的打印机迁移方案。第三,如果只是修改单台打印机设置,PRNCNFG.vbs脚本更灵活,但学习曲线较陡。注意到用户上次询问时已经接触过rundll32和PRNMNGR.vbs方案,这次应该提供更务实的生产环境方案。特别要强调权限问题——很多打印机操作需要管理员权限,这点在示例脚本开头就用@echooff和权限检查来体现。最后生成的示例脚本包含三个典型场景:静默安装驱动、从文件恢复打印机配置、修改单个打印机属性。每个命令都给出安全提示,因为错误配置可能导致打印服务崩溃。相关延伸问题特意引导用户关注企业环境部署和错误处理,这是脚本实际使用时的痛点。</think> 在 Windows 环境下,可通过 DOS 批处理脚本(.bat)调用系统工具或脚本来管理打印机配置。以下是几种常见方法及示例: --- ### 方法:使用 `printbrm.exe`(打印机迁移工具) 通过备份/还原操作调用打印机配置文件(.printerExport): ```batch @echo off REM 备份所有打印机配置到文件 printbrm -B -F "C:\Backup\Printers.printerExport" REM 从配置文件恢复打印机 printbrm -R -F "C:\Backup\Printers.printerExport" ``` > **说明**: > `printbrm.exe` 是 Windows 内置工具,适用于批量部署打印机配置[^1]。 --- ### 方法二:使用 `PRNMNGR.vbs` 脚本 调用 VBS 脚本管理打印机(需管理员权限): ```batch @echo off REM 添加网络打印机 cscript C:\Windows\System32\Printing_Admin_Scripts\zh-CN\prnmgr.vbs -ac -p "\\打印服务器\打印机名" -m "驱动型号" REM 删除打印机 cscript C:\Windows\System32\Printing_Admin_Scripts\zh-CN\prndrvr.vbs -d -m "驱动型号" ``` > **注意**:路径 `zh-CN` 可能需根据系统语言调整(如英文系统为 `en-US`)[^2]。 --- ### 方法三:直接操作注册表(高级) 通过 `reg` 命令导入导出打印机注册表配置: ```batch @echo off REM 导出当前打印机配置 reg export HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Print\Printers "C:\printer_config.reg" REM 导入配置(需重启打印服务) reg import "C:\printer_config.reg" net stop spooler && net start spooler ``` > **风险提示**:直接修改注册表可能导致系统不稳定,操作前务必备份。 --- ### 完整示例:批量部署打印机 ```batch @echo off set PRINT_SERVER=\\192.168.1.100 set PRINTER_NAME=HP_LaserJet REM 静默安装驱动 pnputil /add-driver "C:\Drivers\hp.inf" /install REM 添加网络打印机 rundll32 printui.dll,PrintUIEntry /in /n "%PRINTER_SERVER%\%PRINTER_NAME%" REM 设为默认打印机 rundll32 printui.dll,PrintUIEntry /y /n "%PRINTER_SERVER%\%PRINTER_NAME%" ``` --- ### 关键组件说明 | 工具/命令 | 作用 | 适用场景 | |---------------------|-------------------------------|-----------------------| | `printbrm.exe` | 批量导入导出打印机配置 | 企业环境迁移 | | `prnmgr.vbs` | 脚本化添加/删除打印机 | 精确控制驱动型号 | | `rundll32 printui.dll` | 图形化打印管理功能的命令行调用 | 快速设置默认打印机 | | `pnputil` | 安装/卸载打印机驱动 | 驱动预部署 | --- ### 注意事项 1. **权限要求**:所有操作需以**管理员身份运行**批处理脚本 2. **驱动兼容性**:确保驱动文件(.inf)与系统架构匹配(x64/x86) 3. **路径规范**:使用短路径(如 `C:\Progra~1\`)避免空格导致的错误 > 引用说明: > 打印机物理删除操作需同步底层打印系统[^1],但 Windows 环境下通常通过系统工具实现配置管理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值