2013-05-28 157 views
0

我有一位用户在她登录我们的终端服务器时想让本地桌面打印机成为默认打印机。我已经创建了一个简单的登录脚本此将默认打印机设置为更改名称的打印机

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 
+0

我建议修复名称更改而不是试图解决它。 –

+0

我已经看过,但显然客户端打印机是动态添加到终端服务器。因此,取决于通过RDP会话连接到终端服务器的其他本地打印机的数量决定了打印机重命名的内容。除了分享她的打印机,然后将其添加到终端服务器,然后将共享设置为她的默认值(然后不应该改变),我找不到任何其他方法。实际上这可能是比此登录脚本更好的解决方案。嗯... – Josh

回答

0

如果您不能修复名称更改的事情,您应该能够解决它。

从循环构造开始。在这种情况下,我们会使用一个循环:

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 

区分大小写。

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 
0

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

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

相关问题