Powershell - 删除除最高数字以外的所有数字

Powershell - delete all but the highest number

正在编写脚本以删除除最高的 "Copy" 打印机以外的所有打印机(Microsoft 及其无限的帮助每次我的一位远程用户 unplugs/plugs 在打印机中创建 "Copy" 打印机)在 Windows 7 台电脑上。

我有两个不同的打印机名称,由于这个问题得到了很多 "copies"。在一种情况下,这很容易,因为我想删除所有 "Copy" 打印机,但保留原始打印机 - 名称中没有 "Copy" 的打印机。我首先清除所有打印作业(如果队列中有现有作业,则不会删除打印机),然后删除所有 "POS Lexmark (Copy)" 打印机 -

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

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

效果很好。在第二种情况下,我想保留编号最高的 "Copy" 打印机 - 即,如果有 12 台 "Copy" 打印机,我想保留 "Lexmark Universal PS3 (Copy 12)" 打印机,但删除所有其他打印机。我有一个自然排序函数行:

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

在这种情况下我可以使用它来对所有 "Copy" 打印机进行排序,但是这

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

将无法工作,因为我仍然需要保留排序后编号最高的打印机。我是 Powershell 新手,所以任何帮助将不胜感激,因为 Google 搜索还没有为我找到任何东西。

谢谢

您能否将排序后的结果放入一个变量中,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()}