0

我有它承载约1000打印机的打印机服务器中删除的打印队列。我想删除其中的一个。PowerShell的 - 从打印服务器

我目前使用这个命令:

$p = Get-WmiObject -Class Win32_printer -ComputerName $server -namespace "root\CIMV2" -filter "name='printer0456'" 

它的工作原理,它找到的打印机,然后我可以使用此命令将其删除:

$p.delete() 

但是出怪胎的地狱我的第一个命令需要2-3分钟才能找到打印机。对我来说,它是有意义的。

有什么我做错了,或者别的东西,我可以用它来删除打印机快?

编辑:检查我的回应

这样一来,它只能取整,直到它开创的,而不是分析整个打印机列表中正确的打印机。

+0

远程使用'Get-WmiObject'命令时,可能需要一段时间才能返回。它得到的整个列表和过滤器返回任何东西之前,所以它可能需要一段时间,特别是因为你有关于1000打印机为它筛选通过。如果你想加快速度,你可以尝试使用PowerShell远程处理和调用命令,好像它是本地的。我还没有使用过这个功能,所以我不能说它会不会加快速度,但是值得一试。 – Nick

回答

0

临时的解决方案,我发现

$p = $null 
Get-WmiObject -Class Win32_printer -ComputerName $server|ForEach-Object{ 
    if($_.name -eq "printer0456"){ 
     $p = $_ 
     break 
    } 
} 
if($p -ne $null){ 
    $p.delete() 
} 
0

其WMI查询成本,使缓存结果。拉取集合中的所有打印机。过滤收集并删除您想要的打印机。

$printers = gwmi Win32_printer -ComputerName $server -namespace "root\CIMV2" 

$del = $printers | ? { $_.Name -eq "printer1"} 
$del.delete() 
$del = $printers | ? { $_.Name -eq "printer6"} 
$del.delete() 
$del = $printers | ? { $_.Name -eq "printer89"} 
$del.delete() 

您可以使用-like-match过滤有足够的类似名称的打印机。像这样,

$printers = gwmi Win32_printer -ComputerName $server -namespace "root\CIMV2" 

$del = $printers | ? { $_.Name -match "printer10[1-3]" } # Match printer101..103 
$del | % {$_.delete()} 
+0

这并不帮助我,因为我只是删除每个脚本实例1级的打印机。我在帖子中描述了一个解决方案。 –

0

$p = gwmi win32_printer | ? {$_.name -match "PrintServer"} | % ($i in $p) {$i.delete()}

这只会删除在他们的名字路径如下打印服务器名称打印机。

+0

不应该是'gwmi win32_printer | ? {$ _。name -match“PrintServer”} | %($ i in $ _){$ i.delete()}'? – Tweek

0
$PrintersTodelete = Get-WmiObject -Class Win32_printer -ComputerName $server -filter "name='printer0456'" 
if($printersToDelete){ 
    Foreach($printer in $PrintersTodelete){ 
     $printer.delete() 
     } 
} 
1

您应该使用WMI加速器来加快您对WMI的查询速度。

$PrinterInstance = [wmi]"\\$CentralServer\root\cimv2:Win32_Printer.DeviceID='$PrinterName'" 

的DeviceID是在WMI数据库和默认的DeviceID索引值应该是相同的打印机名称。

0
<# 
    Delete printers on remote servers using csv list(server,printer) 
    Note: For queues with job(s), they will be stuck in a "deleting" 
    state and you must clear the job(s) manually, the queue will delete 
    after that. Or, you will need to write in code to stop spooler and 
    delete jobs from \spool\printers. Not a big enough deal to warrant 
    risk of spooler not starting back up. 
#> 

$InCSVPath = "\\path_to_list_file\printerstodelete.csv" 

$csv = Import-Csv $InCSVPath 
foreach($item in $csv){ 

     $server = $item.Server 

     $printer = $item.Printer 

     $a = Get-WmiObject -Class Win32_printer -ComputerName $server -Filter "name= '$printer'" 

     if($a){ 

      "Deleting Printer: " + $a.Name # 

       $a.Delete() 

     } 

     else{ 

       "could not delete: "+$printer 

     } 

}