提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

之前我有篇文章 《VBScript实现Word和Excel的打印》 介绍了VBScript或者VBA实现Word和Excel的打印,基本上可以了解,其打印所要调用的是PrintOut方法,但是实际操作后发现其调用的是预先设置的默认打印机,有没有一种办法指定某种特定打印机进行打印呢?

非常遗憾的是,我没能找到较好的办法去解决这个问题,当然如果你知道的话可以与大家分享一下。经过一番搜索,发现微软脚本专家的 《如何将文本文件打印到默认打印机之外的打印机?》 这篇文章提出了一个变通的办法,大家可以尝试一下,具体的做法就是,先将所指定的打印机设为默认打印机,然后调用比如PrintOut打印,打印结束后,再将设置改回。

具体的代码摘录如下:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" &_
  strComputer & "\root\cimv2")

' 下面检索当前的默认打印机
Set colPrinters =  objWMIService.ExecQuery _
  ("Select * from Win32_Printer Where Default = TRUE")

' 将\变为转义\\
For Each objPrinter in colPrinters
  strOldDefault = objPrinter.Name
  strOldDefault = Replace(strOldDefault, "\", "\\")
Next

' 找到我们所指定的打印机
Set colPrinters =  objWMIService.ExecQuery _
  ("Select * from Win32_Printer Where " &_
  "Name = '\\\\atl-ps-01\\printer2'")

For Each objPrinter in colPrinters
  objPrinter.SetDefaultPrinter() ' 设为默认
Next

WScript.Sleep 2000

' 执行打印的操作
' .PrintOut

' 还原原先的默认打印机
Set colPrinters =  objWMIService.ExecQuery _
  ("Select * from Win32_Printer Where Name = '" &_
   strOldDefault & "'")

For Each objPrinter in colPrinters
  objPrinter.SetDefaultPrinter()
Next

上述代码不难理解,只是为什么要转义一次,主要是因为WMI查询必须考虑类JavaScript或者C语言那样的转义字符,脚本专家上这样解释的:

为什么呢?是这样,如果默认打印机恰好为网络打印机,它将具有类似下面的名称:\\atl-ps-01\printer1。这并没有什么问题,只是稍后我们需要在脚本的 WQL Where 子句中使用该打印机名称。由于 \ 为保留字符,因此我们必须通过使用两个 \ 字符来“转义”每个 \ 字符;换句话说,我们的打印机(用于 Where 子句)的名称必须为 \\\\atl-ps-01\\printer1。我们使用 VBScript 的 Replace 函数来用一对 \ 替换打印机名称中的每个 \。

END