2014-03-28 32 views
0

我正尝试将本地计算机上的打印机从旧打印服务器移动到新打印服务器。如果我保持打印机名称与我的代码相同。但是,如果我想在重新命名打印机的同时尝试重置objItem.Name的值。在下面的代码中,我如何在我的select Case语句中重命名objItem.Name?如何在VBScript中重命名objItem.Name

On Error Resume Next 

Dim strComputer, DefaultPTR 
Dim objWMIService, colItems, WshNetwork 
Dim LogFile 
Dim wshShell 
CONST ForWriting = 2 
CONST ForAppending = 8 

Set wshShell = CreateObject("WScript.Shell") 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
UserProf = wshShell.ExpandEnvironmentStrings("%USERPROFILE%") 
LogFile = UserProf & "\MovePtrsToNewPrintServerName.txt" 

If (objfso.FileExists(UserProf & "\MovePtrsToNewPrintServerName.txt")) Then 
    'WScript.Echo("File exists!") 
    WScript.Quit() 
Else 
    Set objFile = objFSO.CreateTextFile(LogFile, ForWriting) 
End If 

strComputer = "." 
DefaultPTR=0 

Set WshNetwork = CreateObject("WScript.Network") 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48) 

For Each objItem in colItems 

    If UCase(Left(objItem.Name,21)) = "\\OldPrintServerName\" Then 
    If objItem.Attributes And 4 Then 
     DefaultPTR = 1 
    End If 

    objItem.Name.Delete_ 


    Select Case UCase(objItem.Name) 

    Case "\\OldPrintServerName\HP4000" 
     objItem.Name.Rename "\\OldPrintServerName\HPP3005" '<--- I know this doesn't work so 
                  ' how can I rename objItem.Name to 
                  ' the new printer name? 

    End Select 

    WshNetwork.AddWindowsPrinterConnection "\\NewPrintServerName\" & Right(objItem.Name,Len 
    (objItem.Name) - 9) 
    If Not Err.Number = 0 then 
     objFile.WriteLine "Problem with " & Right(objItem.Name,Len(objItem.Name) - 21) 
     Err.Clear 
    End if 
    If DefaultPTR = 1 then 
     WshNetwork.SetDefaultPrinter "\\NewPrintServerName\" & Right(objItem.Name,Len 
     (objItem.Name) - 21) 
     DefaultPTR = 0 
    End If 
    End If 

Next 

objFile.WriteLine "Printers have been moved from OldPrintServerName to NewPrintServerName" 
+0

的'Win32_Printer'类有一个[RenamePrinter](http://msdn.microsoft.com/en-us/library/aa393050%28v=vs.85%29.aspx)函数。 'objItem.RenamePrinter“”'应该做的伎俩。 – Bond

+0

不幸的是,这并没有帮助。我不只是试图重新命名一台打印机。我试图将几个移动到一个新的打印服务器,并在同一时间重新命名一些。我真的想改变objItem.Name的值,所以其余的代码将工作。 – user3473084

回答

0

是的,RenamePrinter方法可供使用。我更新了下面的代码以适应该命令。

具体做法是:

Select Case UCase(objItem.Name) 
    Case "\\OldPrintServerName\HP4000" 
     objItem.RenamePrinter("HPP3005") 
    End Select 

而且,你所需要的打印机名称和共享名来区分。 ShareName是当用户直接转到打印服务器时在网络浏览器中显示的内容。

因此配置共享名,而不是打印机的名称,这将是:

For Each objPrinter in colPrinters 
    objPrinter.ShareName = "HPP3005" 
    objPrinter.Put_ 
Next 

On Error Resume Next 

Dim strComputer, DefaultPTR 
Dim objWMIService, colItems, WshNetwork 
Dim LogFile 
Dim wshShell 
CONST ForWriting = 2 
CONST ForAppending = 8 

Set wshShell = CreateObject("WScript.Shell") 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
UserProf = wshShell.ExpandEnvironmentStrings("%USERPROFILE%") 
LogFile = UserProf & "\MovePtrsToNewPrintServerName.txt" 

If (objfso.FileExists(UserProf & "\MovePtrsToNewPrintServerName.txt")) Then 
    'WScript.Echo("File exists!") 
    WScript.Quit() 
Else 
    Set objFile = objFSO.CreateTextFile(LogFile, ForWriting) 
End If 

strComputer = "." 
DefaultPTR=0 

Set WshNetwork = CreateObject("WScript.Network") 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48) 

For Each objItem in colItems 

    If UCase(Left(objItem.Name,21)) = "\\OldPrintServerName\" Then 
    If objItem.Attributes And 4 Then 
     DefaultPTR = 1 
    End If 

    objItem.Name.Delete_ 


    Select Case UCase(objItem.Name) 
    Case "\\OldPrintServerName\HP4000" 
     objItem.ShareName = "HPP3005" 
     objItem.Put_ 
    End Select 

    WshNetwork.AddWindowsPrinterConnection "\\NewPrintServerName\" & Right(objItem.Name,Len 
    (objItem.Name) - 9) 
    If Not Err.Number = 0 then 
     objFile.WriteLine "Problem with " & Right(objItem.Name,Len(objItem.Name) - 21) 
     Err.Clear 
    End if 
    If DefaultPTR = 1 then 
     WshNetwork.SetDefaultPrinter "\\NewPrintServerName\" & Right(objItem.Name,Len 
     (objItem.Name) - 21) 
     DefaultPTR = 0 
    End If 
    End If 

Next 

objFile.WriteLine "Printers have been moved from OldPrintServerName to NewPrintServerName" 

而这里的一篇文章详细介绍了方法 - >HERE

+0

Hello Rich,感谢您的回复。我将不得不看脚本男人的文章,并试图更好地理解。使用修改后的代码,如果我在Select Case语句后立即添加了wscript.echo objItem.Name,它仍然以\\ OldPrintServerName \ HP4000而不是\\ OldPrintServerName \ HPP3005形式出现。 – user3473084

+0

对,因为我们重命名了打印机存储的文件,所以既然这是联网打印机,我已经更新了上面的代码以重命名SharedName。请尝试使用上面更新的代码并让我知道。 – Rich

+0

你好,很抱歉,我仍然得到相同的结果。同样,如果我在End Select之后立即添加了wscript.echo objItem.Name,它仍然以\\ OldPrintServerName \ HP4000而不是\\ OldPrintServerName \ HPP3005形式出现。谢谢您的帮助。我知道必须有一种方法来修改objItem的name属性。 – user3473084