2009-01-14 2 views
10

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

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

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

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

-JT

ответ

8

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

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

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

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

Смежные вопросы