如何在Powershell过滤器中嵌入管道操作符?

时间:2011-02-14 22:54:30

标签: powershell powershell-v2.0

我正在尝试制作一个按文件扩展名分组的过滤器。使用group运算符,很容易:

$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($_) } }

如何编写一个接收管道的函数并通过另一个过滤器返回它?

2 个答案:

答案 0 :(得分: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(用于大小)或类似的东西。您可以使用名称重载来构建函数,以根据您所称的方式执行不同的操作。或者,如果您不熟悉重载,则可以为每个函数创建单独的函数。

我希望这有助于回答你的问题。

此致 罗德尼菲斯克

答案 1 :(得分:1)

过滤器对通过管道传递的每个单独对象起作用。在您的代码中,您基本上是一次对一个对象进行分组。您需要做的是将所有对象收集在一起,然后对它们进行分组。您可以使用带有BEGIN,PROCESS和END块的函数。

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