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

Vbscript 将默认打印机设置为更改名称的打印机,vbscript,printers,Vbscript,Printers,我有一个用户,当她登录到我们的终端服务器时,希望将她的本地桌面打印机作为默认打印机。我已经为此创建了一个简单的登录脚本 Set WSHNetwork = CreateObject("WScript.Network") WSHNetwork.SetDefaultPrinter "HP LaserJet 6P (redirected 3)" 问题在于,无论出于何种原因,打印机名称都会不断更改最后一位数字。HP LaserJet 6P(重定向)、HP LaserJet 6P(重定向2)和HP Las

我有一个用户,当她登录到我们的终端服务器时,希望将她的本地桌面打印机作为默认打印机。我已经为此创建了一个简单的登录脚本

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

如果你不能解决名称改变的问题,你应该能够解决它

从循环构造开始。在本例中,我们将使用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

区分大小写。

您可以更改该代码,只查找包含名称第一部分的任何内容,
“HP LaserJet 6P(重定向)”


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


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

我建议修复名称更改,而不是尝试解决它。我已经研究过这一点,但显然客户端打印机是动态添加到终端服务器的。因此,这取决于通过RDP se连接到终端服务器的其他本地打印机的数量ssions确定打印机重命名为什么。除了共享她的打印机,然后将其添加到终端服务器,然后将共享设置为默认设置(该设置不应更改)之外,我找不到其他解决方法。这实际上可能是比此登录脚本更好的解决方案。Hmmm。。。
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