Powershell - 删除除最高数字之外的所有内容

Posted

技术标签:

【中文标题】Powershell - 删除除最高数字之外的所有内容【英文标题】:Powershell - delete all but the highest number 【发布时间】:2016-02-03 21:11:05 【问题描述】:

在 Windows 7 PC 上编写脚本以删除除最高“复制”打印机之外的所有打印机(Microsoft 及其无限的帮助会在我的一个远程用户每次拔下/插入打印机时创建“复制”打印机)。

由于这个问题,我有两个不同的打印机名称,它们获得了许多“副本”。在一种情况下,这很容易,因为我想删除所有“复制”打印机,但保留原始打印机 - 名称中没有“复制”的打印机。我首先清除所有打印作业(如果队列中有现有作业,则不会删除打印机),然后删除所有“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 新手,所以任何帮助都将不胜感激,因为谷歌搜索还没有为我找到任何东西。

谢谢

【问题讨论】:

【参考方案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()

【讨论】:

是的!这行得通。非常感谢你。研究了很长一段时间,但始终无法让伯爵工作。

以上是关于Powershell - 删除除最高数字之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

需要一个正则表达式来删除除数字之外的所有内容

从 PHP 中的字符串中删除除字母数字字符之外的所有内容

PHP 删除字符串中除数字之外的所有内容

从字符串中删除非数字字符(不包括句点和逗号)(即删除除数字、逗号和句点之外的所有字符)

如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

PHP PHP:删除除字母和数字之外的所有内容 - Reg表达式