2011-02-14 60 views
0

我在嘗試製作一個按文件擴展名分組的過濾器。跟團操作,很容易:如何在Powershell過濾器中嵌入管道操作員?

$fileList | group { [io.path]::getextension($_) } 

我想作出上述成過濾器,以節省一些打字,所以我可以做這個:

$fileList | group-by-extension 

,但我有找出正確的語法有困難。這些顯然不起作用,例如:

filter group-by-extension { $_ | group { [io.path]::getextension($_) } } 
function group-by-extension { $_ | group { [io.path]::getextension($_) } } 

如何編寫一個接收管道並通過另一個過濾器運行的函數?

回答

1

充當過濾器自帶通過管道每個單獨的對象上。在你的代碼中,你基本上是一次對一個對象進行分組。你需要做的是將所有的對象集中在一起,然後對它們進行分組。您可以使用BEGIN,PROCESS和END塊的功能。

function GroupBy-Extension { 
BEGIN {$all = @() } 
PROCESS { $all += $_} 
END {$all | group extension} 
} 
+0

啊哈!我沒有意識到END可以返回值。好的,這樣就解決了我的具體問題,涉及到團隊運作。但更一般地說,如果我想使用流式運算符(除了組之外的其他東西,比如說'where'),並且保持懶惰的eval?在這種情況下,我不想在傳遞到下一個操作之前緩衝到本地數組中。 – scobi 2011-02-15 19:57:41

1

我不確定你是否特別想按屬性排序(在這種情況下是擴展名),或者用管道更好。假設它是你想要進行的排序,請允許我向你展示最簡單的方法。

Get-ChildItem | Sort-Object extension 

這裏有一個關於它的鏈接:http://technet.microsoft.com/en-us/library/ee176968.aspx

因爲這需要多個關鍵字來完成的,它不能被混淆。它必須寫成一個函數。我喜歡兩個或三個字母的命令名稱。 Unix就是這樣,它使打字更簡單。也許讓函數獲取你想要排序的參數,該參數就是Sort-Object所需的參數。所以,我將其稱爲Get-ChildItem-Sorted的gcis。語法可能是"gcis extension"。或者,如果你像我一樣,你甚至不喜歡把這個參數放進去。 (我對命令行非常懶惰)。將函數調用爲gcie(用於按擴展名排序),gcit(用於時間),gcis(用於大小)或類似的東西。您可以使用名稱重載來構建該函數,以根據您所稱的行爲有所不同。或者,如果你不擅長超載,你可以爲每個人製作一個單獨的功能。

我希望這可以幫助和回答你問的問題。

問候, 羅德尼·菲斯克