如何在Powershell过滤器中嵌入管道操作员?
问题描述:
我在尝试制作一个按文件扩展名分组的过滤器。跟团操作,很容易:如何在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($_) } }
如何编写一个接收管道并通过另一个过滤器运行的函数?
答
充当过滤器自带通过管道每个单独的对象上。在你的代码中,你基本上是一次对一个对象进行分组。你需要做的是将所有的对象集中在一起,然后对它们进行分组。您可以使用BEGIN,PROCESS和END块的功能。
function GroupBy-Extension {
BEGIN {$all = @() }
PROCESS { $all += $_}
END {$all | group extension}
}
答
我不确定你是否特别想按属性排序(在这种情况下是扩展名),或者用管道更好。假设它是你想要进行的排序,请允许我向你展示最简单的方法。
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(用于大小)或类似的东西。您可以使用名称重载来构建该函数,以根据您所称的行为有所不同。或者,如果你不擅长超载,你可以为每个人制作一个单独的功能。
我希望这可以帮助和回答你问的问题。
问候, 罗德尼·菲斯克
啊哈!我没有意识到END可以返回值。好的,这样就解决了我的具体问题,涉及到团队运作。但更一般地说,如果我想使用流式运算符(除了组之外的其他东西,比如说'where'),并且保持懒惰的eval?在这种情况下,我不想在传递到下一个操作之前缓冲到本地数组中。 – scobi 2011-02-15 19:57:41