lmilesuk
lmilesuk

Reputation: 1

VBScript, Delete Exact String Only

Hi I have the following VBscript to remove printers, however when I run it, it is also deleting just Canon IR70.

Dim aPrinterModels(2)
aPrinterModels(0)="Canon IR70 (Cpoy 1)"
aPrinterModels(1)="Canon IR70 (Cpoy 2)"
aPrinterModels(2)="Canon IR70 (Cpoy 3)"

for each printer in aPrinterModels
    RemovePrinterAndPort(printer)
next

Sub RemovePrinterAndPort(strModelMask)
    on error resume next
    msiMessageTypeError = &H01000000 
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    'objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
    Set colInstalledPrinters =  objWMIService.ExecQuery("Select * from Win32_Printer where name like'" & strModelMask & "%'") 
    if colInstalledPrinters.count<>0 then   
        For each objPrinter in colInstalledPrinters
            Set colInstalledPorts =  objWMIService.ExecQuery("Select * from Win32_TCPIPPrinterPort where name like '" & objPrinter.PortName & "'")
            objPrinter.Delete_
            For Each objPort in colInstalledPorts 
                objPort.Delete_
            Next
        Next
    end if
    Set colInstalledPrinters = Nothing
    Set colInstalledPorts = nothing 
    Set objWMIService = Nothing
End Sub

How can I get it to only delete the exact string in aPrinterModels??

Many thanks in advance.

Upvotes: 0

Views: 143

Answers (1)

JosefZ
JosefZ

Reputation: 30123

I cannot try wmi query with your scenario and like comparison but I'd use = comparison as follows:

Set colInstalledPrinters = objWMIService.ExecQuery( _
  "Select * from Win32_Printer where name = '" & strModelMask & "'")

The code snippet with objPort.Delete execute only on the assumption that ports for copied printer instances differ from original printer port. In more presumable case of the same port for all printer instances (original and copies): modify code snippet with objPort.Delete to be performed conditionally or suppress it at all and remove unused ports as an independent task:

for each printer in aPrinterModels
    RemovePrinter(printer)
next
RemoveUnusedPorts

Sub RemovePrinter(strModelMask)
    'on error resume next
    msiMessageTypeError = &H01000000 
    Set objWMIService = GetObject( _
      "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery( _
    "Select * from Win32_Printer where name = '" & strModelMask & "'") 
if colInstalledPrinters.count<>0 then
    For each objPrinter in colInstalledPrinters
        ' wscript.Echo "Printer to Delete " & objPrinter.Name
        objPrinter.Delete_
    Next
end if
Set colInstalledPrinters = Nothing
Set objWMIService = Nothing
End Sub

Sub RemoveUnusedPorts
   ' code snippet to remove unused ports here
End Sub

Upvotes: 0

Related Questions