Рекомендации по разработке командлетов Powershell - PullRequest
11 голосов
/ 14 января 2009

Я сейчас собираю несколько командлетов Powershell. Построить их достаточно просто, но я не знаю, правильно ли я их строю (так сказать).

Существуют ли какие-либо руководящие принципы / передовые практики, которым следует следовать для передачи данных в конвейер Powershell? На данный момент я фактически вывожу один объект типа DataSet - если какой-либо командлет захочет использовать его в нисходящем направлении, ему придется циклически перебирать DataTables в этом DataSet, а затем перебирать DataRows в каждом DataTable.

Полагаю, вопрос в том ... Собираюсь ли я кого-нибудь этим сделать? Или я должен выводить данные, которые по своей сути представляют собой набор строк?

Спасибо всем заранее

-JT

Ответы [ 2 ]

9 голосов
/ 14 января 2009

Допустимо выводить любой тип объекта, который лучше всего использовать для представления того, что вы пишете, - набор данных абсолютно подходит. Единственное потенциальное предостережение заключается в том, что версия 2 PowerShell может работать на сокращенной версии .NET Framework (например, на Server Core), поэтому, если это потенциальный сценарий для ваших командлетов, вам нужно проявить осторожность, чтобы убедиться, что выводимый вами объект существует в каждой системе, где может использоваться ваш командлет.

Все это говорит о том, что конвейер работает лучше всего, когда он содержит коллекции объектов; DataSet не является коллекцией как таковой. Другими словами, вы хотите, чтобы нижестоящие командлеты могли получать по одному объекту за раз по конвейеру, чтобы эти командлеты не должны были вручную перечисляться через объект. Я не очень много знаю о том, что именно вы делаете, - вполне может быть, что DataSet полностью уместен, - но я бы предпочел видеть цикл командлетов внутри DataSet, создавать свои собственные пользовательские объекты (чтобы каждый столбец в таблице становится свойством) и выводит эти объекты в конвейер. Это просто увеличивает количество нижестоящих командлетов, которые могут потреблять то, что вы выводите.

Простой тест - передать вывод командлета в Export-CSV. Если это работает (и, вероятно, не с DataSet), то вы делаете правильные вещи , как правило, . Теперь вам может потребоваться создать командлет, который выводит DataSet, и вы только намерены для некоторых других написанных вами командлетов (которые используют DataSets) для работы с этим выводом. В этом нет ничего плохого. Максимальная гибкость - это отдельные объекты, поскольку она позволяет всем основным командлетам PowerShell работать с вашим выводом.

Надеюсь, это поможет.

7 голосов
/ 20 августа 2009

MSDN имеет удивительный набор Руководств по разработке командлетов , которые я нашел чрезвычайно полезными при разработке своих собственных. Они разбиты на три разных раздела:

...