0

約1000台のプリンタをホストするプリンタサーバーがあります。これらの1つを削除したいと思います。

私は現在このコマンドを使用しています:

$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 に答える