2013-05-28 213 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」在連接到服務器之前,本地工作站是默認的。

相關問題