Ответ 1
Допустимо выводить любой тип объекта, который лучше всего используется для представления того, что вы пишете - DataSet абсолютно прав. Единственная потенциальная осторожность заключается в том, что v2 PowerShell может работать на сокращенной версии .NET Framework (например, на Server Core), поэтому, если это потенциальный сценарий для ваших командлетов, вам нужно использовать некоторую осторожность, чтобы убедиться, что объект, который вы выводите, существует в каждой системе, где может использоваться ваш командлет.
Все, что сказано, трубопровод работает лучше всего, когда он содержит коллекции объектов; DataSet не является коллекцией как таковой. Другими словами, вы хотите, чтобы командлеты downstream могли получать один объект за раз по конвейеру, так что этим командлетам не нужно вручную перечислять через объект. Я не очень разбираюсь в том, что вы делаете - вполне возможно, что DataSet вполне уместен, но я обычно предпочитаю внутреннюю контур cmdlet через DataSet, создавать свои собственные пользовательские объекты (так что каждый столбец в таблице становится свойством) и выводит эти объекты в конвейер. Это просто увеличивает количество командлетов ниже по потоку, которые могут потреблять то, что вы делаете.
Простым тестом является передача вывода командлета в Export-CSV. Если он работает (и, вероятно, не будет с DataSet), тогда вы делаете все правильно. Теперь вам может понадобиться создать командлет, который выводит DataSet, и вы только собираетесь использовать некоторые другие командлеты, которые вы написали (которые потребляют DataSets), чтобы работать против этого вывода. В этом нет ничего плохого. Однако максимальная гибкость - это отдельные объекты, поскольку она позволяет всем основным командлетам PowerShell работать на вашем выходе.
Надеюсь, что это поможет.