Передовые методы разработки командлетов Powershell

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

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

Я думаю, что вопрос... я собираюсь сделать это? Или я должен выводить данные, по сути являющиеся связкой строк?

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

-JT

Ответ 1

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

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

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

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

Ответ 2

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