Как встроить оператор конвейера в фильтр Powershell? - PullRequest
0 голосов
/ 15 февраля 2011

Я пытаюсь сделать фильтр, который группирует по расширению файла. С групповым оператором это легко:

$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 ]

1 голос
/ 15 февраля 2011

Фильтры действуют на каждый отдельный объект, который проходит через конвейер.В вашем коде вы в основном группируете один объект за раз.Что вам нужно сделать, это собрать все ваши объекты вместе, а затем сгруппировать их.Вы можете использовать функцию с блоками BEGIN, PROCESS и END.

function GroupBy-Extension {
BEGIN {$all = @() }
PROCESS { $all += $_}
END {$all | group extension}
}
1 голос
/ 15 февраля 2011

Я не уверен, хотите ли вы специально сортировать по свойству (в данном случае это расширение) или лучше с помощью конвейеров. Предполагая, что вы пытаетесь получить сортировку, позвольте мне показать вам самый простой способ сделать это.

Get-ChildItem | Sort-Object extension

Вот ссылка об этом: http://technet.microsoft.com/en-us/library/ee176968.aspx

Поскольку для этого требуется более одного ключевого слова, оно не может быть псевдонимом. Это должно быть написано как функция. Мне нравятся двух- или трехбуквенные названия команд. Unix такой и делает набор текста проще. Может быть, заставить функцию принимать параметр, по которому вы хотите отсортировать, причем этот параметр будет тем, что принимает Sort-Object. Итак, я назову это gcis для Get-ChildItem-Sorted. Синтаксис может быть "gcis extension".

Или, если вы похожи на меня, вам даже не нравится вводить этот единственный параметр. (Я очень ленив в командной строке). Вызовите функцию как gcie (для сортировки по расширению), gcit (для времени), gcis (для размера) или тому подобное. Вы можете построить функцию с перегрузкой имен, чтобы вести себя по-разному в зависимости от того, как вы ее называете. Или вы можете создать отдельную функцию для каждой из них, если вы плохо справляетесь с перегрузкой.

Надеюсь, это поможет и ответит на ваши вопросы.

С уважением, Родни Фиск

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...