将默认打印机设置为更改名称的打印机

时间:2013-05-28 16:03:39

标签: vbscript printers

我有一位用户希望将本地桌面打印机登录到我们的终端服务器时成为默认打印机。我为此

创建了一个简单的登录脚本
Set WSHNetwork = CreateObject("WScript.Network")
WSHNetwork.SetDefaultPrinter "HP LaserJet 6P (redirected 3)"

问题在于,无论出于何种原因,打印机名称都会不断更改最后一位数字。 HP LaserJet 6P(重定向) HP LaserJet 6P(重定向2) HP LaserJet 6P(重定向1)都是如何打印机出现了。

我不清楚VBScript是否足以说明这些变化,我希望有人能帮我找到正在使用的名称变体,并将其设置为默认打印机。

我找到了一个可能有用的代码段,但我不确定如何正确实现它。

Function printerExists(str)
    printerExists = False
    Dim objWMIService
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

    Dim colPrinters
    Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")

    Dim objPrinter
    For Each objPrinter In colPrinters
        If objPrinter.Name = str Then
            printerExists = True
            Exit For
        End If
    Next
End Function

3 个答案:

答案 0 :(得分:0)

如果你无法修改改变名称的东西,你应该可以解决它。

从循环结构开始。在这种情况下,我们将使用for循环:

For i = 0 To 5
    'things happen
next

我选择将数字限制为5或更低,但可以根据您的需要进行更改。 然后我们需要一种方法来包含打印机名称的所有可能性。如果所有te名称都包含一个不带任何特殊代码的数字,但在这里我们将使用if语句来说明如果数字为0,则不包括该数字。

If i = 0 Then
    testPrinter = "HP LaserJet 6P (redirected)"
Else
    testPrinter = "HP LaserJet 6P (redirected " & i & ")"
End If

然后,我们将使用您提供的printerExists功能来确定打印机是否存在,并设置默认打印机。

If printerExists(testprinter) = True Then
    WSHNetwork.SetDefaultPrinter testPrinter
    WScript.Quit
End If

要关闭脚本,我们将所有部分放在一起并添加printerExists功能。最终的脚本最终会看起来像这样:

Set WSHNetwork = CreateObject("WScript.Network")

i = 1 : testPrinter = "HP LaserJet 6P (redirected)"

For i = 0 To 5
    If i = 0 Then
        testPrinter = "HP LaserJet 6P (redirected)"
    Else
        testPrinter = "HP LaserJet 6P (redirected " & i & ")"
    End If

    If printerExists(testprinter) = True Then
        WSHNetwork.SetDefaultPrinter testPrinter
        WScript.Quit
    End If
next

Function printerExists(str)
    printerExists = False
    Dim objWMIService
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

    Dim colPrinters
    Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")

    Dim objPrinter
    For Each objPrinter In colPrinters
        If objPrinter.Name = str Then
            printerExists = True
            Exit For
        End If
    Next
End Function

请记住字符串比较,例如函数中使用的字符串比较:

If objPrinter.Name = str Then

区分大小写。

答案 1 :(得分:0)

您可以更改该代码,只查找包含名称第一部分"HP LaserJet 6P (redirected"的任何内容:

Dim WSHNetwork
Dim objWMIService
Dim colPrinters
Dim objPrinter

Set WSHNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")

For Each objPrinter In colPrinters
    If InStr(objPrinter.Name, "HP LaserJet 6P (redirected") Then
        WSHNetwork.SetDefaultPrinter objPrinter.Name
        Exit For
    End If
Next

Set WSHNetwork = nothing
Set objWMIService = nothing
Set colPrinters = nothing

答案 2 :(得分:0)

打印机的名称是动态的,因为它通过终端服务器或远程桌面连接从本地工作站的打印机列表重定向。如果其他人拥有与上述代码中正在测试的型号相同的型号打印机,那么另一个人的打印机可能会错误地设置此人的默认值。

RDP连接或终端服务器总是尝试将您的本地默认打印机设置为重定向的默认打印机,因此要使“HP Laserjet 6P(重定向)”成为您的默认打印机,您必须将“HP Laserjet 6P”设置为在连接到服务器之前,本地工作站是您的默认工作站。