2016-02-03 89 views
0

使用脚本删除除最高“复制”打印机以外的所有打印机(Microsoft和其无限帮助会在每次有远程用户拔出/插入打印机时创建“复制”打印机)在Windows 7电脑上。Powershell - 删除除最高号码以外的所有号码

我有两个不同的打印机名称,由于这个问题而获得许多“副本”。有一种情况很简单,因为我想删除所有的“复印”打印机,但保留原来的打印机 - 名称中没有“复制”的打印机。我这样做,首先清除所有打印作业(不会删除打印机,如果有一个现有作业坐在队列),然后删除所有“POS利盟(复制)”的打印机 -

Get-WmiObject Win32_Printer | ForEach-Object {$_.CancelAllJobs()} 

Get-WmiObject Win32_Printer -Filter "name LIKE '%POS Lexmark (Copy%'" | ForEach-Object {$_.Delete()} 

的伟大工程。在第二种情况下,我想保留最高的“复印”号码打印机 - 即如果有12台“复印”打印机,我想保留“Lexmark Universal PS3(Copy 12)”打印机,但删除所有其余的打印机。我有一个自然排序函数行:

$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) } 

,我可以用它来在这种情况下,所有的“复制”的打印机进行排序,但这种

Get-WmiObject Win32_Printer -Filter "name LIKE '%PS3 (Copy%'" | Sort-Object $ToNatural | Select-Object | ForEach-Object {$_.Delete()} 

不会起作用,因为我还需要在排序后保留最高数量的打印机。我是Powershell的新手,所以任何帮助将不胜感激,因为谷歌搜索还没有为我提供任何帮助。

谢谢

回答

1

你能不能把你的排序结果为变量,select-object所有,但最后一个(最高)的结果?

$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) } 
$sorted = Get-WmiObject Win32_Printer -Filter "name LIKE '%PS3 (Copy%'" | Sort-Object $ToNatural 
$sorted | Select-Object -First ($sorted.Count-1) | ForEach-Object {$_.Delete()} 
+0

是的!这工作。非常感谢你。一直在研究这一点,并且永远无法让伯爵工作。 – BigRedEO