您好,CD。 您知道,我们重做您好,脚本专家!存档时,创建了专门用于打印的新类别。 不过,当我们开始填写存档页面时,我们非常惊奇地发现 – 我们尚未真正回答许多与打印相关的问题。 我们曾经认为我们一直在回答大量的有关打印方面的问题,但是显然我们只是将这些问题藏匿在了密室中,并且希望他们自生自灭。
我们为什么不愿意回答打印方面的问题呢? 毕竟,在 Windows XP 或 Windows Server 2003 中管理打印机是非常容易的,不是吗?
事实上,对 WMI 打印类所做的改进体现了在 Windows XP 和 Windows 2003 中编写脚本的真正优势之一。问题是这些改进大部分为 Windows 2000 中所没有的功能;坦白地讲,Windows 2000 中的打印管理不是要详细阐述的内容。 (或者不是要在每日脚本编写专栏中详细阐述的内容。) 大部分打印问题的解决方案是特定于 XP/2003 的: 这些解决方案完全不适用于 Windows 2000。由于我们更愿意提供在大多数 Windows 平台上均有效的通用解决方案,我们有点儿急于解决以前的打印问题,并希望没人会注意到这一点。
但我们终究要继续回答这个问题。 只需记住,如果运行的是 Windows 2000,则今天的专栏不适用于您。 该专栏只适用于 XP/2003。 是的,我们知道这不公平。 但事实就是如此。
下面的脚本可在计算机上共享所有本地打印机:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer Where Network = FALSE")
i = 1
For Each objPrinter in colInstalledPrinters
objPrinter.Shared = TRUE
objPrinter.ShareName = "Printer" & i
objPrinter.Put_
i = i + 1
Next
此脚本首先连接到 WMI 服务,然后发出此查询以返回所有本地打印机的集合,即与本地打印机端口相连的所有打印机的集合:
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer Where Network = FALSE")
发出查询后,我们将计数器变量 i 的值设置为 1;稍后我们将通过此变量为每台本地打印机提供一个唯一的共享名称。 然后我们构建一个 For Each 循环以遍历我们的本地打印机集合。
在此循环内执行什么操作? 是这样,对于每台打印机,我们首先会将 Shared 属性的值设置为 True;这样可共享打印机。 顺便说一下,Shared 属性是 Win32_Printer 类的新添加属性;Windows NT 或 Windows 2000 中的 WMI 的版本中不显示该属性,正因如此,此脚本不适用于这些平台。
由于每台共享的打印机均要求具有一个唯一的共享名称,因此我们通过下面一行代码将 ShareName 属性的值设置为 Printer 加计数器变量的值:
objPrinter.ShareName = "Printer" & i
首次执行循环时,i 等于 1,因此 ShareName 将被设置为 Printer1。 随后我们调用 Put_ 方法,将更改实际写入打印机。 请勿遗漏此行代码;如果遗漏了此行代码,将不会保存您的更改,且不会共享打印机。 然后我们将 i 的值加 1,并再次循环。 这就意味着集合中下一台打印机的共享名称将为 Printer2,该打印机后面的打印机的共享名称将为 Printer3,依此类推。
正如前面所述,只要您运行的是 Windows XP 或 Windows Server 2003,此脚本即会顺利运行。如果您运行的是 Windows 的其他某个版本 – 那么,看起来我们今天所说的内容就不适合您了。 我要走了;再见!