2016-02-03 133 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