Powershell - 删除除最高编号以外的所有编号

时间:2016-02-03 21:11:06

标签: powershell foreach printers

使用脚本删除除最高级别之外的所有"复制"打印机(微软及其无限的帮助在每次我的远程用户拔出/插入打印机时都会创建"复制"打印机)。

我有两个不同的打印机名称,可以获得许多"副本"由于这个问题。在一个案例中,它很简单,因为我想删除所有"复制"打印机,但离开原始打印机 - 没有"复制"在它的名字。我首先清除所有打印作业(如果队列中存在现有作业,则不会删除打印机),然后删除所有" POS Lexmark(复制)"打印机 -

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的新手,所以任何帮助都会受到赞赏,因为Google搜索还没有为我提供任何帮助。

谢谢

1 个答案:

答案 0 :(得分: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()}
相关问题