0

我有一台打印机服务器,可托管大约 1000 台打印机。我想删除其中之一。

我目前正在使用这个命令:

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

它起作用了,它找到了打印机,然后我可以使用这个命令来删除它:

$p.delete()

但让我大吃一惊的是,第一个命令需要 2-3 分钟才能找到打印机。对我来说,这完全有道理。

有什么我做错了,或者我可以用其他什么来更快地删除打印机?

编辑:检查我的回复

这样,它只会在找到正确的打印机之前进行获取,而不是解析整个打印机列表。

4

6 回答 6

3

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

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

DeviceID 是 WMI 数据库中的索引值,默认情况下 DeviceID 应与打印机名称相同。

于 2017-02-16T06:47:30.677 回答
1

它是成本的 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()}
于 2012-09-27T13:22:37.183 回答
0

我找到的临时解决方案

$p = $null
Get-WmiObject -Class Win32_printer -ComputerName $server|ForEach-Object{
    if($_.name -eq "printer0456"){
        $p = $_
        break
    }
}
if($p -ne $null){
    $p.delete()
}
于 2012-11-29T14:48:35.453 回答
0

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

这只会删除名称路径中具有以下打印服务器名称的打印机。

于 2013-03-06T18:19:55.570 回答
0
$PrintersTodelete = Get-WmiObject -Class Win32_printer -ComputerName $server -filter "name='printer0456'"
 if($printersToDelete){
     Foreach($printer in $PrintersTodelete){
         $printer.delete()
      }
 }
于 2014-04-20T19:49:45.940 回答
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

         }

}
于 2017-07-12T17:43:41.930 回答