Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell-从打印服务器删除打印队列_Powershell_Windows Server 2008_Wmi_Powershell 2.0_Windows Server 2003 - Fatal编程技术网

PowerShell-从打印服务器删除打印队列

PowerShell-从打印服务器删除打印队列,powershell,windows-server-2008,wmi,powershell-2.0,windows-server-2003,Powershell,Windows Server 2008,Wmi,Powershell 2.0,Windows Server 2003,我有一个打印机服务器,它有大约1000台打印机。我想删除其中一个 我当前正在使用此命令: $p = Get-WmiObject -Class Win32_printer -ComputerName $server -namespace "root\CIMV2" -filter "name='printer0456'" 它工作,它找到打印机,然后我可以使用此命令删除它: $p.delete() 但让我抓狂的是,第一个命令需要2-3分钟才能找到打印机。对我来说,这完全有道理 是否有我做错的事情,

我有一个打印机服务器,它有大约1000台打印机。我想删除其中一个

我当前正在使用此命令:

$p = Get-WmiObject -Class Win32_printer -ComputerName $server -namespace "root\CIMV2" -filter "name='printer0456'"
它工作,它找到打印机,然后我可以使用此命令删除它:

$p.delete()
但让我抓狂的是,第一个命令需要2-3分钟才能找到打印机。对我来说,这完全有道理

是否有我做错的事情,或者其他我可以用来更快删除打印机的事情

编辑:检查我的回答


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

这是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()}

我找到的临时解决方案

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

$p=gwmi win32|U打印机|?{$\.name-匹配“PrintServer”}|%($p中的$i){$i.delete()}


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

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

$PrintersTodelete = Get-WmiObject -Class Win32_printer -ComputerName $server -filter "name='printer0456'"
 if($printersToDelete){
     Foreach($printer in $PrintersTodelete){
         $printer.delete()
      }
 }
$PrinterInstance = [wmi]"\\$CentralServer\root\cimv2:Win32_Printer.DeviceID='$PrinterName'"
DeviceID是WMI数据库中的索引值,默认情况下DeviceID应与打印机名称相同。


<#
    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

         }

}
$InCSVPath=“\\path\u to\u list\u file\printerstodelete.csv” $csv=导入csv$InCSVPath foreach($csv中的项目){ $server=$item.server $printer=$item.printer $a=Get-WMIOObject-Class Win32_printer-ComputerName$server-Filter“name=”$printer“ 如果有的话($a){ 正在删除打印机:“+$a.Name”# $a.删除() } 否则{ 无法删除:“+$printer” } }
这对我没有帮助,因为每个脚本实例只删除1台打印机。我在帖子中描述了一个解决方案。远程使用
Get WmiObject
命令时,可能需要一段时间才能返回。在返回任何内容之前,它会得到整个列表和过滤器,因此可能需要一段时间,特别是因为您有大约1000台打印机供其过滤。如果您想加快速度,可以尝试使用PowerShell远程处理并像调用本地命令一样调用该命令。我没有太多地使用这个功能,所以我不能说它是否会加速,但值得一试。它应该是
gwmi win32|U打印机吗?{$\.name-匹配“PrintServer”}|%($中的$i){$i.delete()}